0

使用 Lightinjector DI 框架如何注册同一接口的多个实现?如何在构造函数上提及相同的接口并要求其不同的实现?

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

在尝试注释时,遇到以下异常

 "message": "Unable to resolve type: 
    "innererror": {
      "trace": "   at LightInject.ServiceContainer.CreateDelegate(Type serviceType, String serviceName, Boolean throwError) in C:\\projects\\lightinject\\build\\tmp\\netstandard16\\Binary\\LightInject\\LightInject.cs:line 3901\r\n   at LightInject.ServiceContainer.CreateDefaultDelegate(Type serviceType, Boolean throwError) in C:\\projects\\lightinject\\build\\tmp\\netstandard16\\Binary\\LightInject\\LightInject.cs:line 3859\r\n   at LightInject.ServiceContainer.TryGetInstance(Type serviceType) in C:\\projects\\lightinject\\build\\tmp\\netstandard16\\Binary\\LightInject\\LightInject.cs:line 2777\r\n   at LightInject.Scope.WithThisScope[T](Func`1 function) in C:\\projects\\lightinject\\build\\tmp\\netstandard16\\Binary\\LightInject\\LightInject.cs:line 6169\r\n

容器注册如下,

     container.EnableAnnotatedPropertyInjection();
     container.Register<ILoginHandler, LoginHandler>("LoginHandler");

类“User.cs”的构造函数注入如下,

public class User
{
   public ILoginHandler _loginHandler { get; private  set; }    
   public class([Inject(serviceName: "LoginHandler")]ILoginHandler loginHandler)
   {
      _loginHandler = loginHandler;
   }
}
4

1 回答 1

0

这称为命名服务——这是我见过的大多数 IOC/DI 容器的标准(参见命名服务部分)。

 container.Register<IInterface1, Myclass1>("Foo");
 container.Register<IInterface1, Myclass2>("Bar");
 var instance = container.GetInstance<IInterface1>("Foo");
 Assert.IsInstanceOfType(instance, typeof(Myclass1));

说得通?:)

 public class FooWithNamedAnnotatedProperyDependency
{
    [Inject("Foo")]
    public IInterface1 Service { get; set; }
}

或者

public FooWithNamedAnnotatedDependency([Inject(ServiceName="Foo")]IInterface1 service)
{
    _service = service;
}

看注释

于 2020-09-06T18:59:36.033 回答