在我正在使用的MVC应用程序中,他们已经注册并解决了控制器本身内的所有Interface / Concrete类依赖项。我读到了关于ioc和依赖倒置的内容,并发现已完成的事情完全无用。因为它无论如何都不允许应用程序利用IoC示例模拟,单元测试的好处,并且还会增加不必要地添加/解析依赖项的成本。以下是代码示例:
HomeController
using(IUnityContainer container= new UnityContainer())
{
container.RegisterType<IRepository1, Repository1>()
IRepository1 _repos1 = container.Resolve<IRepository1>();
}
如果我们没有从中获得任何好处,我没有看到做这些事情的任何意义。有人可以告诉我现在或将来是否有任何用处?
如果没有,我打算简单地使用具体实现或类似实例化它们:
IRepository1 repos1= new Repository1();
请忽略语法。
(我现在编辑了代码片段。)
答案 0 :(得分:1)
使用容器首先注册然后解决具体类型没有任何意义,没有任何好处。您仍然与具体类型相关联。您可能会争辩说容器有助于将所有构造函数参数与相应类型的实例匹配,但在我看来,这并不算作真正的好处。
如果您真的不打算使用外部解析的抽象,那么是的,您可以安全地删除膨胀容器代码并创建具体实例,就像您所呈现的一样。
答案 1 :(得分:0)
这个问题的直接答案是你当前的实现会导致更多的开销和性能影响,然后进行标准构建,你应该删除它;或者重新设计Unity的实现。
以下是解析为具有使用统一容器注册的其他类型的依赖关系的类型时注入的好处的示例。
public class UserService
{
internal readonly IRepository _repository;
public UserService(IRepository repository)
{
_repository = repository;
}
//Service Method that exposes 'Domain Logic'
public void CreateUser(string FirstName)
{
_repository.Insert<User>(new User() { FirstName = FirstName }); //Assumes there is a Generic method, Insert<T>, that attaches instances to the underline context.
}
public User GetUser(string FirstName)
{
return _repository.Query<User>().FirstOrDefault(user => user.FirstName == FirstName); // assumes there is a Generic method, Query<T>, that returns IQueryable<T> on IRepository
}
}
注册类型(可能是Global.asax中的单例模式)
//Resolver is an instance of UnityContainer
Resolver.RegisterType<IRepository, Repository>(new ContainerControlledLifetimeManager());
Resolver.RegisterType<IUserService, UserService>();
然后控制器中的逻辑就像这样:
var service = Resolver.Resolve<IUserService>(); //the resolver will resolve IRepository to an instance as well...
var user = service.GetUser("Grant");