Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在构造函数注入期间,Unity DI容器能否识别正在构造的类型,并在解析引用时使用它?_.net_Dependency Injection_Unity Container - Fatal编程技术网

.net 在构造函数注入期间,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<

我想使用Unity DI容器将
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
等类。