我已经说过十几种类型T
,它们继承自EntityObject
和IDataObject
。
我有以下接口的通用
IDataManager<T> where T : EntityObject, IDataObject ...
我还有数据管理员的基类
BaseDataManager<T> : IDataManager<T> where T : EntityObject, IDataObject ....
我有特定的课程
public class Result : EntityObject, IDataObject ....
public class ResultDataManager : BaseDataManager<Result> ...
我想实现服务定位器,它将为IDataManager<T>
T
的实例
但我坚持如何在没有大量演员的情况下以一种简洁的方式实现它。
有什么想法吗?
更新: 我曾经使用以下代码来发现使用我之前的服务定位器对它们进行registring的类型:
foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
{
if (type.GetInterface("ISQLDataAccessManager") != null && !type.IsAbstract)
{
var manager = (ISQLDataAccessManager)Activator.CreateInstance(type);
_managers.Add(type, manager);
var typeDO = manager.GetDataObjectType();
_typeNames2Types.Add(typeDO.FullName, typeDO);
_managers2BO.Add(typeDO, manager);
}
}
似乎我并不真正理解泛型的反思
答案 0 :(得分:3)
如果将定位器设为单例,则这是一个简洁的解决方案:
static class Locator
{
private static class LocatorEntry<T> where T : ...
{
public static IDataManager<T> instance;
}
public static void Register<T>(IDataManager<T> instance) where T : ...
{
LocatorEntry<T>.instance = instance;
}
public static IDataManager<T> GetInstance<T>() where T : ...
{
return LocatorEntry<T>.instance;
}
}
如果你不能将定位器实现为单例,我相信没有创建字典&lt; Type,object&gt;做一些演员表:
class Locator
{
private readonly Dictionary<Type, object> instances;
public Locator
{
this.instances = new Dictionary<Type, object>();
}
public void Register<T>(IDataManager<T> instance) where T : ...
{
this.instances[typeof(T)] = instance;
}
public IDataManager<T> GetInstance<T>() where T : ...
{
return (IDataManager<T>)this.instances[typeof(T)];
}
}