【问题标题】:Dependency Injection - construction依赖注入 - 构造
【发布时间】:2012-02-12 04:59:38
【问题描述】:

我想知道我的思路是否正确,我主要针对接口进行编程,所以我想知道下面的类是应该通过 DI 注入还是我应该自己实例化一个类...

注意:这些服务保存在我的核心 libaray 中,而不是我的网络应用程序 (asp.net mvc)

//IUserSession 永远不知道,这取决于客户端应用程序,这永远不知道,所以我必须始终注入

//IWorkflowService我需要注入,因为客户端应用程序有几个不同的服务/包,这取决于业务规则可能会有所不同

//IReadonlySession 在我的应用中只有 1,所以我不需要注入?在其他客户端调用中可能会有所不同,但不太可能

//INotificationService 将永远是我所说的,它永远是一回事,所以我应该针对接口编程而不是注入?

private readonly IUserSession _userSession;
private readonly IReadOnlySession _readonlySession;
private readonly INotificationService _notificationService;

public Processor(IUserSession userSession, IWorkflowService workflowService)
        : base(workflowService)
    {
        _userSession = userSession;
        _readonlySession = new ReadonlySession();
        _notificationService = new NotificationService();
    }

//IReadonlySession 被注入,因为这可能会根据我是否正在运行测试而改变,我可能使用不同的数据库,或者我可能会从不同的客户端应用程序调用我的代码(不太可能但可能)

public Processor(IUserSession userSession, IWorkflowService workflowService,   IReadonlySession readonlySession)
        : base(workflowService)
    {
        _userSession = userSession;
        _readonlySession = readonlySession;
        _notificationService = new NotificationService();
    }

问题:

我的对象实例化是否正确?我实施的方式是否正确?

【问题讨论】:

  • @MarkSeemann:更新...

标签: .net oop dependency-injection constructor constructor-injection


【解决方案1】:

如果您仍然与 NotificationService 有硬耦合,那么针对接口进行编程几乎没有什么收获,所以我想说

  • 任一注入 INotificationService
  • 针对具体类的程序

由于似乎有一些合适的默认值,您应该考虑构造函数链接

public Processor(IUserSession userSession, IWorkflowService workflowService)
    : this(userSession, workflowService, new ReadonlySession()) { }

public Processor(IUserSession userSession,
    IWorkflowService workflowService, IReadonlySession readonlySession)
    : base(workflowService)
{
    _userSession = userSession;
    _readonlySession = readonlySession;
    _notificationService = new NotificationService();
}

这将为您的图书馆的使用者提供一种简单的入门方式,而不会限制高级用户。

您可能还想使用此处概述的 Facade 解决方案:Dependency Inject (DI) "friendly" library

【讨论】:

  • 感谢您的回答 - 它确实帮助我理清了一些事情,我将稍微考虑一下为什么我需要 INotificationService 的接口,构造函数链接非常适合。
猜你喜欢
  • 2011-02-02
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2020-07-27
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多