ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-12 20:07:42  阅读:204  来源: 互联网

标签:c net design-patterns inversion-of-control ioc-container


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有