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

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]));

(编辑:李大同)

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

    推荐文章
      热点阅读