Seemann的DI Azure Table数据访问

Mark Seemann在书中的“依赖注入.Net”一书中,第二章分析了一些写得不好的3层asp.net应用程序。主要观点是:应用程序失败,因为最低层数据访问无法从SQL与实体框架转换为无SQL数据库的Azure。下面是详细的报价单:Seemann的DI Azure Table数据访问

为了使电子商务应用的云应用程序,数据访问库 必须与使用表存储服务模块进行更换。这可能吗? 从图2.10中的依赖关系图中,我们已经知道用户界面和域库都依赖于基于实体框架的数据访问库。 如果我们试图删除数据访问库,该解决方案将不再编译, 因为缺少必需的DEPENDENCY。 在一个包含数十个模块的大型应用程序中,我们也可以尝试删除那些无法编译的 模块以查看剩下的内容。在Mary的申请中,很明显我们必须删除所有模块,而没有留下任何东西。

虽然有可能开发一个Azure Table中数据访问 库是模拟原始数据访问 库显示的API,有没有办法,我们可以把它注射到应用程序中。

图2.10:

我的问题是 - 这是为什么模仿以前的行为模块不能被注入到应用程序,以及这究竟意味着什么?它与Azure细节有关吗?我以前没有在no-sql数据库上工作太多。

回答:

Essentialy,他的意思是说你的UI代码直接依赖于数据访问库中的代码。如何这样的例子可能会在UI层使用:

public class SomeController : Controller 

{

[Route("someRoute")]

[HttpGet]

public ViewResult SomeRoute()

{

// Here we're using the data component directly

var dataComponent = new DataAccessLayer.DataComponent();

return View(dataComponent.GetSomeData());

}

}

如果我们想换出数据访问库这意味着我们将不得不进入我们的所有控制器和修改代码以使用新组件(除非我们在相同的命名空间中创建完全相同的类名,但这不太可能)。

在另一方面,我们也可以这样写控制器是这样的:

public class SomeController : Controller 

{

IDataComponent _dataComponent;

public SomeController(IDataComponent dataComponent)

{

_dataComponent = dataComponent;

}

[Route("someRoute")]

[HttpGet]

public ViewResult SomeRoute()

{

// Now we're using the interface that was injected

return View(_dataComponent.GetSomeData());

}

}

通过定义这样的类,我们可以从外部指定哪些具体的类,它实现了IDataComponent接口应注入构造。这使我们能够在外部“连线”我们的应用程序。我们正在向一个班级注入具体的课程。

依赖注入是一种使“针对接口而不是具体类进行编程”更容易的方法。

Mark Seemann给出的例子涉及到数据库和Azure表存储,但这只是一个例子。这与NoSql(或通常的存储机制)无关。同样的原则适用于所有依赖于其他类(通常是服务类的类)的东西。

编辑之后的评论: 确实,你可以修改DataComponent的内部(或存储库,如果这就是你使用的)。 但是,使用DI(和编程针对一般的接口),为您提供了更多的选择:

  • 你可以在同一时间有不同的实现方式,并注入不同的实现取决于哪个控制器,它是(例如)
  • 通过指定注册中的生命周期(可能在此情况下不可用),您可以在所有控制器中重复使用同一个实例
  • 出于测试目的,您可以向控制器注入不同的实现(例如模拟,你可以测试调用)

以上是 Seemann的DI Azure Table数据访问 的全部内容, 来源链接: utcz.com/qa/263625.html

回到顶部