是否值得避免在autofac容器中新增服务?

时间:2014-07-09 09:29:13

标签: c# dependency-injection autofac

我正在尝试在使用类库项目中的某些服务的控制台应用程序中使用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();
} 

是否有任何我想不到的缺点?

这不是什么大问题,但在实际情况下,我需要为同一个界面和其他相对更复杂的场景注册不同的东西,所以我认为如果新建参数没有什么问题我会去找它

由于

2 个答案:

答案 0 :(得分:1)

直接实例化服务的一个缺点是其他注册无法覆盖IDateService 的实施 - 他们必须更改不相关的注册。如果您的应用程序变得足够大并且您开始将注册拆分为模块,则该限制可能不清楚,并且人们可能想知道为什么IDateService其他地方是他们注册的那个但是它没有正确地注入这个实例。

如果DateServiceIDisposable ,另一个缺点是 - Autofac将跟踪一次性用品并为您清理它们。在这种情况下,您需要自己处理DateService

直接实例化的好处是技术上更快 - 您不会通过Autofac层来结束new DateService()

没有推荐方式 - 您需要根据应用的需求进行选择。

答案 1 :(得分:1)

在Travis的回答的基础上,单独注册DateService还可以简化您对ParamService的注册:

builder.RegisterType<ParamService>().As<IParamService>();

我更喜欢这种语法,因为如果ParamService被修改为需要添加构造函数参数,则其Autofac注册保持不变。