如何避免通用服务定位器中的硬引用?
How to avoid hard referencing in Generic Service Locator?
请看下面的代码
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)];
}
}
}
存在硬引用。
有什么办法可以避免吗?
There is a hard referencing.
Is there any way by which I can avoid it?
没有
当您构建使用 IoC 的应用程序时,其想法是使应用程序松散耦合。这是 service locator is considered anti-pattern 的原因之一:您的应用程序将与服务定位器紧密耦合,并且实际上没有办法将您的应用程序与它分开。另一方面,如果您使用构造函数注入,则可能使您的应用程序完全不知道提供其依赖项的容器或它提供的具体类型。
与应用程序的其余部分不同,容器是我们唯一需要耦合的地方。我们需要这种耦合来告诉容器将哪些依赖项放在哪里。因此,容器内的硬引用是有意的。
也就是说,您所做的并不是复制 DI 容器所做的。 DI 容器的主要目的是将依赖项的 对象图 组合到应用程序中。您正在做的是存储单个实例,实际上无法将依赖项注入它们,无法控制它们的生命周期,无法处置它们等。如果您的 EmployeeRepository
需要依赖项(例如Entity Framework 上下文)?您将如何确保正确处理上下文?你真的应该选择一个可用的 DI 容器,而不是试图重新发明轮子,因为有很多事情已经经过深思熟虑和彻底测试,比如给每个实例一个单独的生命周期,由容器控制。
请看下面的代码
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)];
}
}
}
存在硬引用。
有什么办法可以避免吗?
There is a hard referencing.
Is there any way by which I can avoid it?
没有
当您构建使用 IoC 的应用程序时,其想法是使应用程序松散耦合。这是 service locator is considered anti-pattern 的原因之一:您的应用程序将与服务定位器紧密耦合,并且实际上没有办法将您的应用程序与它分开。另一方面,如果您使用构造函数注入,则可能使您的应用程序完全不知道提供其依赖项的容器或它提供的具体类型。
与应用程序的其余部分不同,容器是我们唯一需要耦合的地方。我们需要这种耦合来告诉容器将哪些依赖项放在哪里。因此,容器内的硬引用是有意的。
也就是说,您所做的并不是复制 DI 容器所做的。 DI 容器的主要目的是将依赖项的 对象图 组合到应用程序中。您正在做的是存储单个实例,实际上无法将依赖项注入它们,无法控制它们的生命周期,无法处置它们等。如果您的 EmployeeRepository
需要依赖项(例如Entity Framework 上下文)?您将如何确保正确处理上下文?你真的应该选择一个可用的 DI 容器,而不是试图重新发明轮子,因为有很多事情已经经过深思熟虑和彻底测试,比如给每个实例一个单独的生命周期,由容器控制。