如果我有一个实现通用接口的类,可以使用unity xml config配置它。
public interface IReader<T> { }
public class Fund { }
public class FundReader : IReader<Fund> { }
和unity 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 config:
<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配置工作。
我缺少什么让这项工作?
(如果还尝试创建特定的别名,但也无法使其工作)
答案 0 :(得分:7)
别名为我工作......
<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]], TestUnityIssue, Version=1.0.0.0, Culture=neutral, 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" />