依赖注入

Mur*_*rat 9 c# dependency-injection

public interface ITaskProvider
{
    T GetTask<T>();
}
Run Code Online (Sandbox Code Playgroud)

在下面的ITaskprovider的实现中,正如您所看到的那样,IUserTask和IIdentityTask是从属性而不是构造函数注入的.原因是Windsor在访问时自动实例化运行时注入的属性,因此我不必将所有必须注入的依赖项放在构造函数中.

public class TaskProvider : ITaskProvider
    {
        public IUserTasks UserTasks { get; set; }

        public IIdentityTasks IdentityTasks { get; set; }

        public T GetTask<T>()
        {
            Type type = typeof(T);
            if (type == typeof(IUserTasks)) return (T)this.UserTasks;
            if (type == typeof(IIdentityTasks)) return (T)this.IdentityTasks;

            return default(T);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在控制器中,我在构造函数中注入ITaskProvider.

public ITaskProvider TaskProvider { get; set; }

public AuctionsController(ITaskProvider taskProvider)
        {
            TaskProvider = taskProvider;
        }
Run Code Online (Sandbox Code Playgroud)

在这里,我称任务提供者及其方法很好.

public ActionResult Index()
{
 var userTasks = TaskProvider.GetTask<IUserTasks>();
 var user = userTasks.FindbyId(guid);

}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切正常.

有人告诉我,这更像是一个服务定位器模式,违反了依赖注入模式,我想知道这里违反了什么.

ktu*_*nik 4

对我来说,关于维基百科,您的代码中没有违反 DI 的情况:

将行为与依赖解析分离的核心原则

但不好的一面是你的控制器知识太多,在某些情况下(如果你不仔细编程)你可能会违反德米特法则

看看你的代码:

public ActionResult Index()
{
 var userTasks = TaskProvider.GetTask<IUserTasks>();
 var user = userTasks.FindbyId(guid);
}
Run Code Online (Sandbox Code Playgroud)