C# 依赖注入
这里我称taskprovider及其方法为fineC# 依赖注入,c#,dependency-injection,C#,Dependency Injection,这里我称taskprovider及其方法为fine public ITaskProvider TaskProvider { get; set; } public AuctionsController(ITaskProvider taskProvider) { TaskProvider = taskProvider; } public ActionResult Index() { var userTasks=TaskProvider.Ge
public ITaskProvider TaskProvider { get; set; }
public AuctionsController(ITaskProvider taskProvider)
{
TaskProvider = taskProvider;
}
public ActionResult Index()
{
var userTasks=TaskProvider.GetTask();
var user=userTasks.FindbyId(guid);
}
到目前为止,一切正常
我被告知这更像是一个服务定位器模式,违反了依赖注入模式,我想知道这里违反了什么。如果控制器需要一个
IUserTasks
实例,那么直接从容器接收一个实例会更简单。本质上,TaskProvider
只是容器的包装,因为它从容器中获取UserTasks
和IdentityTasks
实例。您使用依赖项注入来注入有效的“服务定位器”而不是注入IUserTasks和IIdentialTasks的实现
您的实际控制器确实依赖于IUserTasks和IIdentityTasks,但您并没有直接将它们注入控制器,而是决定使用“服务定位器”或者任务提供者,因此您已经在服务定位器上注入了依赖项,在本例中,它似乎没有提供任何不能通过直接注入真正的依赖项来实现的功能 您应该将IUserTask和IIdentityTask注入控制器的构造函数,因为使用TaskProvider没有好处。除此之外,在您这样做的方式中,您会错过一些编译时检查。例如,您可以调用TaskProvider.GetTask()并等待在运行时分解。您至少应该对该泛型参数设置一些约束(如果两个接口都可以从公共父接口继承的话)
关于“违规”,您应该注意,您没有将依赖项注入控制器。您提供了一种检索它们的方法。对于我来说,您的代码中没有违反DI的内容,关于: 将行为与依赖项解析分离的核心原则 但坏的一面是你的控制器有太多的知识,在某些情况下(如果你不小心编程),你可能会违反 看看你的代码:
public ActionResult Index()
{
var userTasks = TaskProvider.GetTask<IUserTasks>();
var user = userTasks.FindbyId(guid);
}
public ActionResult Index()
{
var userTasks=TaskProvider.GetTask();
var user=userTasks.FindbyId(guid);
}
是的,这只是一个包装。它仍然违反依赖项注入模式吗?@Murat-如果它被注入到依赖项中,那就不是真正的违反,它只是没有提供任何价值。感谢这些有用的东西。
public ITaskProvider TaskProvider { get; set; }
public AuctionsController(ITaskProvider taskProvider)
{
TaskProvider = taskProvider;
}
public ActionResult Index()
{
var userTasks = TaskProvider.GetTask<IUserTasks>();
var user = userTasks.FindbyId(guid);
}
public ActionResult Index()
{
var userTasks = TaskProvider.GetTask<IUserTasks>();
var user = userTasks.FindbyId(guid);
}