如何避免通用服务定位器中的硬引用?

时间:2015-04-03 19:32:49

标签: c# .net-4.0

请查看下面的代码

using EmployeeRepositories.SingularRepositories;
using System;
using System.Collections.Generic;

namespace LocateService
{
    public class ServiceLocator : IService
    {
        public Dictionary<object, object> servicecontainer = null;
        public ServiceLocator()
        {
            servicecontainer = new Dictionary<object, object>();
            servicecontainer.Add(typeof(IEmployeeRepository), new EmployeeRepository());
            servicecontainer.Add(typeof(IDepartmentRepository), new DepartmentRepository());
        }
        public T GetService<T>()
        {
           return (T)servicecontainer[typeof(T)];

        }
    } 
}

有一个很难参考。

有什么方法可以避免它吗?

1 个答案:

答案 0 :(得分:0)

  

有一个难以参考的内容。

     

有什么方法可以避免它吗?

没有

当您构建使用IoC的应用程序时,我们的想法是使应用程序松散耦合。这就是为什么service locator is considered anti-pattern:您的应用程序将与服务定位器紧密耦合并且实际上无法将应用程序与其分离的原因之一。另一方面,如果使用构造函数注入,则可能使应用程序完全不知道提供其依赖项的容器或它提供的具体类型。

与应用程序的其余部分不同,容器是我们 想要耦合的唯一地方。我们需要这种耦合,以告诉容器放在哪里的依赖项。因此,硬引用是在容器内故意的。

那就是说,你所做的并不是重复DI容器的作用。 DI容器的主要目的是将依赖项的对象图组合到应用程序中。你正在做的是存储单个实例,实际上无法将依赖注入其中,无法控制它们的生命周期,无法处理它们等等。如果你的EmployeeRepository需要依赖(例如实体框架上下文)?您如何确保上下文得到妥善处理?你应该选择一个可用的DI容器,而不是试图重新发明轮子,因为有许多这样的东西已经过考虑并经过全面测试,例如给每个实例提供一个由容器控制的单独生命周期。 p>