编程语言
首页 > 编程语言> > c# – 传递IOC容器的替代方法

c# – 传递IOC容器的替代方法

作者:互联网

我有以下几个依赖的基类:

public abstract class ViewModel
{
    private readonly ILoggingService loggingService;

    public ViewModel(
        ILoggingService loggingService,
        ...)
    {
        this.loggingService = loggingService;
        ...
    }
}

在我的派生类中,我不想重复此基类构造函数中的所有参数,所以我这样做:

public abstract class ViewModel
{
    private readonly IUnityContainer container;
    private ILoggingService loggingService;
    ...

    public ViewModel(IUnityContainer container)
    {
        this.container = container;
    }

    public ILoggingService LoggingService
    {
        get
        {
            if (this.loggingService == null)
            {
                this.loggingService = this.container.Resolve<IUnityContainer>();
            }

            return this.loggingService;
        }
    }

    ...
}

现在我的派生类只需要将一个东西传递给我的基类构造函数.我也有很好的效果,只有在需要时才能解析我的依赖项.

但是,我已经知道传递一个IOC容器是一个坏主意.什么是最好的替代设计模式,记住传入的许多服务已经作为单身人士在我的IOC容器中注册?

解决方法:

如你所述,你应该避免绕过容器.这会把它变成一个“持有袋”,在那里你再也看不到你的依赖是什么了,你不能轻易看到包里有什么.

相反,如果你发现你的构造函数需要太多参数,这本身就是一种气味.在这种情况下,您经常会发现您的班级正在尝试做太多事情(这违反了单一责任原则).

查看参数列表,看看是否可以将参数分组为更小的组.例如,如果您的构造函数采用IEmailSender,IEventLog和ILoggingService,那么您真正需要的是一个聚合这三个依赖项的INotificationService.

当然,有时你会有一个具有许多依赖项的构造函数.在这种情况下,该类可能只是用于将这些东西聚集在一起并将它们连接起来.如果是这种情况,班级应该避免做任何实际的工作.

标签:c,net,design-patterns,inversion-of-control,ioc-container
来源: https://codeday.me/bug/20190712/1444105.html