【发布时间】:2019-02-28 22:47:54
【问题描述】:
我有一个通用类 Logger<TProvider> where TProvider : ILogProvider,我想为它配置 Autofac 的依赖注入。
这个类也有一个构造函数:
public Logger(LogType loggerType)
目前是这样使用的:
var logger = new Logger<Log4NetLogProvider>(LogType.CMS);
我想知道这是否可能是依赖注入,或者由于需要类型/构造函数参数而无法实现?
我知道RegisterGeneric 方法,例如:
builder.RegisterGeneric(typeof(Logger<>)).AsSelf()
我想知道如何告诉 autofac 传入了哪个 TProvider 并提供构造函数参数 LogType?或者这不是 DI 的理想选择?
【问题讨论】:
-
您是否希望使用 LogType.CMS 构造的记录器可以与使用 LogType.Foo 构造的记录器互换使用?如果不是,那么您的设计应该使用单独的接口进行通信——ICmsLogger 和 IFooLogger。然后,您的服务将依赖特定的接口。
-
@MikeHixson - 这是一个我没想到的好主意
-
@MikeHixson 这可行,但我必须针对记录器类指定所有接口类型,例如:
public class Logger : IFileLogger, IKenticoLogger, IKenticoAndFileLogger, ISmtpLogger这有点难看。有没有办法给它一个“基础”接口,例如每个接口都基于的ILogger? -
似乎一长串接口一直在您的软件中,只是以不可互换的 Logger 实例的形式隐藏在设计中。现在它们已经出现在设计中并被认为是“丑陋的”,也许是时候做点什么了。也许重新考虑拥有这么多不同类型的记录器?就个人而言,我认为一长串接口没有任何问题。
-
@MikeHixson - 也许“丑陋”是错误的词。似乎应该可以简单地指定“ILogger”,因为其他接口都派生自它,但我猜不是。
标签: c# .net dependency-injection autofac