c# – Ninject上下文绑定w / Open Generics
发布时间:2020-12-15 05:39:04 所属栏目:百科 来源:网络整理
导读:我有一个通用接口IRepository T和两个实现xrmRepository T和efRepository T 我想基于T更改绑定,更具体地说,当T派生自Entity时使用xrmRepository.我怎么能做到这一点? 我目前有: kernel.Bind(typeof(IRepository)).To(typeof(efRepository)).InRequestScope
我有一个通用接口IRepository< T>和两个实现xrmRepository< T>和efRepository< T>
我想基于T更改绑定,更具体地说,当T派生自Entity时使用xrmRepository.我怎么能做到这一点? 我目前有: kernel.Bind(typeof(IRepository<>)).To(typeof(efRepository<>)).InRequestScope(); kernel.Bind(typeof(IRepository<>)).To(typeof(xrmRepository<>)).When(request => request.Service.GetGenericArguments()[0].GetType().IsSubclassOf(typeof(Entity))).InRequestScope(); 但是,当我尝试解决IRepository< Contact>它转到efRepository,即使Contact继承实体. 我不想使用命名绑定,否则我将不得不在任何地方添加名称. 解决方法
您也可以像这样定义绑定.我不知道运行时性能,但我认为这种方式更具可读性.如果我没有遗漏某些东西,它应该导致相同的行为.
kernel.Bind(typeof(IRepository<>)) .To(typeof(efRepository<>)) .InRequestScope(); kernel.Bind<IRepository<Entity>>() .To<xrmRepository<Entity>>() .InRequestScope(); 编辑 如果目标是为从Entity继承的每个类使用xrmRepository,那么应该这样做 kernel.Bind(typeof(IRepository<>)) .To(typeof(XrmRepository<>)) .When(request => typeof(Entity).IsAssignableFrom(request.Service.GetGenericArguments()[0])); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |