这个问题是我上周末发布的this问题的后续问题。
截至目前,我在我的服务层中有类似的东西,它与MVC应用程序中的UI进行对话。
IDepartmentService deptService = kernel.Get<IDepartmentService>();
IList<Department> deptList = deptService.GetAllDepartments();
一切都很好,DI正如预期的那样工作。但是,出于某种原因,如果我决定使用Structuremap,那么我需要更改整个服务层。如何将其抽象出来,以便DI工具的更改不会影响我的服务层或影响最小。
答案 0 :(得分:2)
但是,出于某种原因,如果我决定使用Structuremap,那么我的 需要更改整个服务层。
那不是真的。如前一个主题所示,服务层对DI框架一无所知。
您应该有一个名为composition root
的图层。这是唯一知道DI框架和所有底层的层。这是你在做作文的地方。因此,如果您更改DI框架,则需要进行更改的唯一位置是组合根。
因此,您绝对应该从您的服务中删除kernel.Get<>
来电。目前您正在使用服务定位器而不是依赖注入。服务定位器是一种反模式。您的服务层应如下所示:
public class MyService
{
private readonly ISomeDependency dependency;
public MyService(ISomeDependency dependency)
{
this.dependency = dependency;
}
public void SomeMethod()
{
// do something with the dependency here
}
}
而不是:
public class MyService
{
private readonly ISomeDependency dependency;
public MyService()
{
this.dependency = kernel.Get<ISomeDependency>();
}
public void SomeMethod()
{
// do something with the dependency here
}
}