我正在尝试在使用类库项目中的某些服务的控制台应用程序中使用autofac。
我的容器配置是这样的
public static IContainer Configure()
{
var builder = new ContainerBuilder();
builder.RegisterType<DateService>().As<IDateService>();
builder.Register(paramService => new ParamService(paramService.Resolve<IDateService>()).As<IParamService>();
return builder.Build();
}
但是在控制台应用程序中,我实际上并没有将DateService用于任何事情(即它的唯一用途是作为容器中新创的ParamService的参数)所以我想知道它是否值得这样做或者只是足够做
public static IContainer Configure()
{
var builder = new ContainerBuilder();
builder.Register(paramService => new ParamService(new DateService()).As<IParamService>();
return builder.Build();
}
是否有任何我想不到的缺点?
这不是什么大问题,但在实际情况下,我需要为同一个界面和其他相对更复杂的场景注册不同的东西,所以我认为如果新建参数没有什么问题我会去找它
由于
答案 0 :(得分:1)
直接实例化服务的一个缺点是其他注册无法覆盖IDateService
的实施 - 他们必须更改不相关的注册。如果您的应用程序变得足够大并且您开始将注册拆分为模块,则该限制可能不清楚,并且人们可能想知道为什么IDateService
其他地方是他们注册的那个但是它没有正确地注入这个实例。
如果DateService
为IDisposable
,另一个缺点是 - Autofac将跟踪一次性用品并为您清理它们。在这种情况下,您需要自己处理DateService
。
直接实例化的好处是技术上更快 - 您不会通过Autofac层来结束new DateService()
。
没有推荐方式 - 您需要根据应用的需求进行选择。
答案 1 :(得分:1)
在Travis的回答的基础上,单独注册DateService
还可以简化您对ParamService
的注册:
builder.RegisterType<ParamService>().As<IParamService>();
我更喜欢这种语法,因为如果ParamService
被修改为需要添加构造函数参数,则其Autofac注册保持不变。