.net 在构造函数注入期间,Unity DI容器能否识别正在构造的类型,并在解析引用时使用它?
我想使用Unity DI容器将.net 在构造函数注入期间,Unity DI容器能否识别正在构造的类型,并在解析引用时使用它?,.net,dependency-injection,unity-container,.net,Dependency Injection,Unity Container,我想使用Unity DI容器将Microsoft.Extensions.Logginglogger插入类的构造函数中: using Microsoft.Extensions.Logging; namespace LoggingExample { public class MyClass { private readonly ILogger<MyClass> _logger; public MyClass(ILogger<
Microsoft.Extensions.Logging
logger插入类的构造函数中:
using Microsoft.Extensions.Logging;
namespace LoggingExample
{
public class MyClass
{
private readonly ILogger<MyClass> _logger;
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.LogInformation("Doing something.");
}
}
}
然后,对于这个类,我们需要某种方法将ILogger
解析为Logger
,或者对于任何类,在更一般的情况下,解析为Logger
,其中T
表示被注入的类
这是在Stackoverflow应答中使用简单注射器DI容器和条件注册完成的:
container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
_ => true);
IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger, Logger<MyClass>>(Constants.LOGGER_MYCLASS_UNITY_KEY,
new ContainerControllerLifetimeManager());
container.register条件(
类型(ILogger),
c=>typeof(Logger).MakeGenericType(c.Consumer.ImplementationType),
生活方式,单身,
_=>正确);
有条件注册是否可以统一进行?Unity是否有其他方法可以识别它正在注入的类
ILogger
,并解析引用以注入Logger
对象(其中T
是被注入的类)?您可以为每个ILogger
实例定义名称并使用[依赖项]
属性指定所需的属性。例如:
public static class Constants
{
public const string LOGGER_MYCLASS_UNITY_KEY = "ILogger<MyClass>";
}
公共静态类常量
{
public const字符串记录器\u MYCLASS\u UNITY\u KEY=“ILogger”;
}
在您的统一注册中:
container.RegisterConditional(
typeof(ILogger),
c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
_ => true);
IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger, Logger<MyClass>>(Constants.LOGGER_MYCLASS_UNITY_KEY,
new ContainerControllerLifetimeManager());
IUnityContainer container=newunitycontainer();
container.RegisterType(Constants.LOGGER\u MYCLASS\u UNITY\u键,
新的容器控制器lifetimemanager());
在需要记录器的类的构造函数中:
public class MyClass
{
private readonly ILogger<MyClass> _logger;
public MyClass([Dependency(Constants.LOGGER_MYCLASS_UNITY_KEY)] ILogger logger)
{
_logger = (ILogger<MyClass>)logger;
}
}
公共类MyClass
{
专用只读ILogger\u记录器;
公共MyClass([Dependency(Constants.LOGGER\u MyClass\u UNITY\u KEY)]ILogger记录器)
{
_记录器=(ILogger)记录器;
}
}
HTH.您可以将其转换回构造函数中的
Logger
。@howcheng:Unity在将ILogger
对象注入构造函数时仍将ILogger
解析为Logger
,对吗?如果有多个类ILogger
被注入,Unity如何知道在解析ILogger
时使用适当的类型参数?例如,在一个类中,它可能必须将记录器
对象注入第二个类a记录器
对象。看起来简单的注入器可以做到这一点。能团结吗?谢谢你。我希望避免注册每个单独的记录器实例。但是,您的回答允许我在类构造函数中使用ILogger
参数,而不是ILogger
。好的,每个ILogger
仍然必须注册到容器中,但您至少不需要创建具体的ILogger
等类。