加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用unity xml config注册具有嵌套泛型的接口

发布时间:2020-12-16 02:01:54 所属栏目:百科 来源:网络整理
导读:如果我有一个实现通用接口的类,可以使用unity xml config配置它. public interface IReaderT { }public class Fund { }public class FundReader : IReaderFund { } 和统一xml: unity xmlns="http://schemas.microsoft.com/practices/2010/unity" namespace
如果我有一个实现通用接口的类,可以使用unity xml config配置它.

public interface IReader<T> { }

public class Fund { }

public class FundReader : IReader<Fund> { }

和统一xml:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <namespace name="System.ComponentModel" />
  <namespace name="TestUnityIssue" />
  <assembly name="TestUnityIssue" />
  <container>
    <register type="IReader[Fund]" mapTo="FundReader" />
  </container>
</unity>

这只是使用以下代码:

var container = new UnityContainer().LoadConfiguration();
var fundReader = container.Resolve<IReader<Fund>>();

但是,在某些情况下,阅读器中使用的类型周围有一个包装器.例如,添加以下两个类:

public class Wrapper<T> { }

public class WrappedFundReader : IReader<Wrapper<Fund>> { }

如果我将以下内容添加到unity配置中:

<register type="IReader[Wrapper[Fund]]" mapTo="WrappedFundReader" />

然后尝试使用以下方法解决它:

var wrappedReader = container.Resolve<IReader<Wrapper<Fund>>>();

我得到以下异常:

InvalidOperationException - The current type,TestUnityIssue.IReader`1[TestUnityIssue.Wrapper`1[TestUnityIssue.Fund]],is an interface and cannot be constructed. Are you missing a type
mapping?

我可以通过使用代码而不是xml来配置它来解决这个问题:

container.RegisterType<IReader<Wrapper<Fund>>,WrappedFundReader>();

或者我可以创建一个介于其间并使用它的接口:

public interface IWrappedReader<T> : IReader<Wrapper<T>> { }

public class WrappedFundReader : IWrappedReader<Fund>

并且配置将更改为:

<register type="IWrappedReader[Fund]" mapTo="WrappedFundReader" />

它仍然会给我一个我可以转换为IReader< Wrapper< Fund>>的实例,但似乎我应该能够使用unity配置工作.

我缺少什么让这项工作?

(如果还尝试创建特定的别名,并且无法使其工作)

解决方法

别名对我有用……

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="WrappedFund" type="TestUnityIssue.Wrapper`1[[TestUnityIssue.Fund,TestUnityIssue,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]],PublicKeyToken=null" />
    <namespace name="TestUnityIssue" />
    <assembly name="TestUnityIssue" />
    <container>
        <register type="IReader[Fund]" mapTo="FundReader" />
        <register type="IReader[WrappedFund]" mapTo="WrappedFundReader" />
    </container>
</unity>

这两个都解决了……

var fundReader = container.Resolve<IReader<Fund>>();
var wrappedReader = container.Resolve<IReader<Wrapper<Fund>>>();

并且根据您的情况,您可能能够获得少于完整的AssemblyQualifiedName …

<alias alias="WrappedFund" type="TestUnityIssue.Wrapper`1[[TestUnityIssue.Fund,TestUnityIssue]],TestUnityIssue" />

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读