c# - 通用工厂方法的统一类型注册

标签 c# generics unity-container

我正在尝试熟悉 asp.net mvc,目前我正在设置日志记录。

我看过 Microsoft.Extensions.Logging 并阅读了有关如何设置它的信息,但我在统一类型注册方面遇到了困难。

我想为

设置类型
public HomeController(ILogger<HomeController> logger)

我可以这样做

    private static void RegisterLoggingTypes(IUnityContainer container)
    {
        ILoggerFactory loggerFactory = new LoggerFactory()
            .AddConsole()
            .AddDebug();
        container.RegisterType<ILogger<HomeController>>(new InjectionFactory(c => loggerFactory.CreateLogger<HomeController>()));
    }

但我不想为每种类型都声明一个。我试过了

container.RegisterType(typeof(ILogger<>), new InjectionFactory((c,t,s) => loggerFactory.CreateLogger(t)));

但这是返回一个 ILogger 而不是 ILogger(of HomeController)

知道我该怎么做吗?

谢谢

最佳答案

我已经弄明白了。我需要使用反射来生成通用方法然后调用它。

        var factoryMethod = typeof(LoggerFactoryExtensions).
                            GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).
                            First(x => x.ContainsGenericParameters);

        container.RegisterType(typeof(ILogger<>), new InjectionFactory((c, t, s) =>
        {
            var genFactoryMethod = factoryMethod.MakeGenericMethod(t.GetGenericArguments()[0]);
            return genFactoryMethod.Invoke(null, new object[] { loggerFactory });
        }));

关于c# - 通用工厂方法的统一类型注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39822807/

相关文章:

c# - 如何为组件/脚本创建泛型池系统?

Scala 泛型方法 - 没有可用于 T 的 ClassTag

ios - Swift 泛型在使用继承时不会实例化泛型

c# - 使用统一依赖框架解决所有方法

c# - ASP.NET MVC 按请求注入(inject)

c# - 如何将实例 ninject 传递到构造函数中

c# - C#Powershell-Exchange管理{“Value cannot be null.\r\nParameter name: serverSettings”}

c# - 将 RTF 文件加载到 Windows richTextBox 时出现问题

c# - ASP.NET Identity UserManager 缓存用户?

c# - 是否可以在 MonoTouch 中对 UILabel 的文本使用 getter/setter?