首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次使用ninject.extensions.conventions绑定服务

多次使用ninject.extensions.conventions绑定服务
EN

Stack Overflow用户
提问于 2013-10-09 11:44:05
回答 1查看 512关注 0票数 2

当使用ninject约定绑定多个接口的所有实现时,我遇到了以下问题:

代码语言:javascript
复制
public interface IServiceA { }
public interface IServiceB { }

public class Service : IServiceA, IServiceB { }

public class FooA
{
    public Foo(IEnumerable<IServiceA> a)
    {
       // a has 2 instances of Service
    }  
}

public class FooB
{
    public Foo(IEnumerable<IServiceB> b)
    {
       // b has 2 instances of Service
    }  
}

// ...
kernel.Bind(x => x
    .FromThisAssembly()
    .SelectAllClasses().InheritedFrom<IServiceA>().
    BindAllInterfaces());

kernel.Bind(x => x
    .FromThisAssembly()
    .SelectAllClasses().InheritedFrom<IServiceB>().
    BindAllInterfaces());

var a = new FooA(kernel.GetAll<IServiceA>());
var b = new FooB(kernel.GetAll<IServiceB>());

我应该如何配置绑定,以便只获得一个Service注入的实例?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 06:26:48

最相似的是,如果有一个组件可以包含在其中两个中,则您的约定是不好的。但是,从这样一个抽象的情景来看,是不可能的。您应该考虑这一点,例如使用命名约定:

代码语言:javascript
复制
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().EndingWith("Service").
BindAllInterfaces());

或者引入一个基本接口:

代码语言:javascript
复制
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses().InheritedFrom<IService>().
BindAllInterfaces());

或者引入一个属性,按命名空间选择,.有很多种方法。另一种选择是分两个步骤选择类:

代码语言:javascript
复制
kernel.Bind(x => x
.FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceA>()
.Join().FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceB>().
BindAllInterfaces());

如果服务类型配置不同,则可以在其中一个绑定中排除特殊情况:

代码语言:javascript
复制
kernel.Bind(x => x
.FromThisAssembly().SelectAllClasses().InheritedFrom<IServiceA>()
.Exclude<Service>().
BindAllInterfaces());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19271097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档