Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖注入_C#_Dependency Injection - Fatal编程技术网

C# 依赖注入

C# 依赖注入,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

这里我称taskprovider及其方法为fine

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);
}