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" /> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |