问题 使用单一界面注册多个实现


有没有办法注册单个接口,该接口由多个具体类使用[simple-injector]并且不使用模板接口实现?

说我们有2节课 MyClass1 和 Myclass2 这两个类都在实现 IInterface1

现在使用[simple-injector]我们无法做到这一点

container.Register<IInterface1, Myclass1>();
container.Register<IInterface1, Myclass2>();

将现有接口转换为模板接口对现有代码库来说是一项艰巨的任务。希望有一些更容易的。


9172
2017-07-26 19:24


起源



答案:


您可以使用以下命令注册同一接口的多个实现 RegisterCollection 方法(见 文件:配置要返回的实例的集合)

所以你需要写:

container.Collection.Register<IInterface1>(typeof(Myclass1), typeof(Myclass2));

而现在Simple Injector可以注入一个集合 Interface1 实现到您的构造函数中,例如:

public class Foo
{
    public Foo(IEnumerable<IInterface1> interfaces)
    {
        //...
    }
}

或者您可以明确解决您的问题 IInterface1 实现与 GetAllInstances

var myClasses = container.GetAllInstances<IInterface1>();

14
2017-07-26 19:47



SimpleInjector的问题是,在为一个接口注册多个实现之后,无法指定应该为给定接口返回哪个已注册的实例。在您的示例中,您无法指定在请求IInterface1时返回类Myclass2的实例。像Ninject这样的其他IoC容器允许“命名”同一服务(接口)的每个注册,因此您可以在解决时间稍后消除歧义。 - Lester
@Lester:如果你需要这个,请确保你没有违反 利斯科夫替代原则 如果你需要这个。但不管怎样,这里有更多关于使用的信息 Simple Injector中的键控注册。 - Steven
@nemesv如果我们一次需要一个实现,例如Shoper类构造函数具有ICreditCard接口。 2类MasterCard和VisaCard课程实施ICreditCard。 Shoper一次需要一个班级。如何在这种情况下使用IOC?


答案:


您可以使用以下命令注册同一接口的多个实现 RegisterCollection 方法(见 文件:配置要返回的实例的集合)

所以你需要写:

container.Collection.Register<IInterface1>(typeof(Myclass1), typeof(Myclass2));

而现在Simple Injector可以注入一个集合 Interface1 实现到您的构造函数中,例如:

public class Foo
{
    public Foo(IEnumerable<IInterface1> interfaces)
    {
        //...
    }
}

或者您可以明确解决您的问题 IInterface1 实现与 GetAllInstances

var myClasses = container.GetAllInstances<IInterface1>();

14
2017-07-26 19:47



SimpleInjector的问题是,在为一个接口注册多个实现之后,无法指定应该为给定接口返回哪个已注册的实例。在您的示例中,您无法指定在请求IInterface1时返回类Myclass2的实例。像Ninject这样的其他IoC容器允许“命名”同一服务(接口)的每个注册,因此您可以在解决时间稍后消除歧义。 - Lester
@Lester:如果你需要这个,请确保你没有违反 利斯科夫替代原则 如果你需要这个。但不管怎样,这里有更多关于使用的信息 Simple Injector中的键控注册。 - Steven
@nemesv如果我们一次需要一个实现,例如Shoper类构造函数具有ICreditCard接口。 2类MasterCard和VisaCard课程实施ICreditCard。 Shoper一次需要一个班级。如何在这种情况下使用IOC?