首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多层应用程序的依赖注入

具有多层应用程序的依赖注入
EN

Stack Overflow用户
提问于 2015-02-23 17:56:42
回答 1查看 62关注 0票数 0

目前,我正在努力理解如何在控制器类之外使用依赖项注入模式。

例如,假设我有以下控制器:

代码语言:javascript
复制
public class TestController : Controller {

  ILog logger;

  public TestController(ILog log) {

   logger = log;

  }

  public string TestMethod() {

    businessLayer businessLayer = new businessLayer();

    return businessLayer.DoSomethingAndLogIt();

  }

}

我理解,在大多数情况下,不可能在控制器类之外使用构造函数注入。因此,不可能直接使用implementation的“业务层”-class。

我能想象到的一个简单的解决方案是:

代码语言:javascript
复制
public class TestController : Controller {

  ILog logger;

  public TestController(ILog log) {

   logger = log;

  }

  public string TestMethod() {

    businessLayer businessLayer = new businessLayer(logger);

    return businessLayer.DoSomethingAndLogIt();

  }

}

因此,将依赖项从控制器传递到底层。但这是最好的方法吗?是否有更好的解决方案让我的商业层类访问ILog-实现?

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2015-02-23 22:38:54

我理解,在大多数情况下,不可能在控制器类之外使用构造函数注入。

这是错误的。您应该对所有组件(应用程序中包含行为的每个类)使用构造函数注入。

依赖注入是将依赖的服务/组件注入到消费组件中。因此,这意味着您不应该在您的控件中新建businesslayer类;您应该使用构造函数注入它。通过增加这个依赖项,您违反了依赖反演原理,这会导致高度耦合。这再次使您的代码更难测试,也使得更改控制器变得更加困难,并且使得将横切关注点(如日志记录、审计跟踪、事务管理等)应用于系统变得更加困难。

因此,不可能直接使用implementation的“业务层”-class。

不正确。ILog实现应该注入到businesslayer类的构造函数中。

长话短说,您的控制器应该如下所示:

代码语言:javascript
复制
public class TestController : Controller {
  IBusinessLayer businessLayer;

  public TestController(IBusinessLayer bl) {
   this.businessLayer = bl;
  }

  public string TestMethod() {
    return businessLayer.DoSomethingAndLogIt();

}}

由于TestController似乎没有直接使用ILog,所以不应该将其注入构造函数中。ILog是业务层类的实现细节,实现细节不应该泄露给使用者(这将再次违反依赖反转原则)。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28680195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档