我不太确定如何实现这一点,或者最好的策略是什么,基本上我有一个(MVC)控制器
public TestController(IService1 service1, IService2 service2,...)
{ }
(目前只有 2 个参数,但可以增加)。
我的想法是创建一个服务工厂类,因此我们可以为工厂提供一个参数,而不是为每个服务提供一个参数,然后获取我们需要的任何服务
private IService1 _service1;
public TestController(IServiceFactory serviceFactory)
{
// this could also be called from a separate action,
// so we only get it when we need it
_service1 = serviceFactory.Get<IService1>();
}
现在我的服务工厂实现有点垃圾,基本上我只有一个缓存所有注册服务和类型的字典:
/// <summary>
/// Service factory class
/// </summary>
/// <remarks>
/// Only one instance of this class should be created during the lifetime of the application
/// </remarks>
public class ServiceFactory : IServiceFactory
{
/// <summary>
/// Locking object
/// </summary>
private static readonly object _lock = new object();
/// <summary>
/// Collection of mappings
/// </summary>
private IDictionary<string, Func<IService>> _mappings;
/// <summary>
/// Default constructor
/// </summary>
public ServiceFactory()
{
_mappings = new Dictionary<string, Func<IService>>();
registerMappings();
}
/// <summary>
/// Get a service from the factory
/// </summary>
public T GetService<T>() where T : IService
{
if (_mappings.Count == 0)
throw new InvalidOperationException("There are no mappings");
lock (_lock)
{
var typeName = typeof(T).Name;
if (_mappings.ContainsKey(typeName))
return (T)_mappings[typeName]();
return default(T);
}
}
/// <summary>
/// Register the mappings needed for this service factory
/// </summary>
private void registerMappings()
{
register<IService1>(() => new Service1())
.register<IService2>(() => new Service2())
.
.
.register<IServiceN>(() => new ServiceN());
}
/// <summary>
/// Register the service classes
/// </summary>
private ServiceFactory register<T>(Func<IService> mapping) where T : IService
{
var type = typeof(T).Name;
if (!_mappings.ContainsKey(type))
_mappings.Add(type, mapping);
return this;
}
}
我的问题是,我可以在服务工厂中使用 IOC 容器并让它处理类型的注册和解析吗?这是一个好方法吗?
或者我可能有一个更根本的问题,我需要一个服务工厂,我应该使用一个吗?
我的 MVC 控制器需要重构只是一件简单的事情,即我可以尝试为每个服务坚持一个控制器?
只是想要一些关于这里最好的方法的提示,当涉及到 DI/工厂模式/其他模式等时,我仍然是一个新手 :)
非常感谢。