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)
到目前为止,一切正常.
有人告诉我,这更像是一个服务定位器模式,违反了依赖注入模式,我想知道这里违反了什么.
对我来说,关于维基百科,您的代码中没有违反 DI 的情况:
将行为与依赖解析分离的核心原则
但不好的一面是你的控制器知识太多,在某些情况下(如果你不仔细编程)你可能会违反德米特法则
看看你的代码:
public ActionResult Index()
{
var userTasks = TaskProvider.GetTask<IUserTasks>();
var user = userTasks.FindbyId(guid);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |