服务定位为仿制药 [英] Service locator for generics
问题描述
我说十几种 T
从 EntityObject
和的IDataObject 继承code>。
我一般如下界面
I have say a dozen types T
which inherit from EntityObject
and IDataObject
.
I have generic the following interface
IDataManager<T> where T : EntityObject, IDataObject ...
我也有基类的数据管理器
I have also base class for data managers
BaseDataManager<T> : IDataManager<T> where T : EntityObject, IDataObject ....
和我有特殊的班
public class Result : EntityObject, IDataObject ....
public class ResultDataManager : BaseDataManager<Result> ...
我想实现服务定位器,这将返回 IDataManager&LT的实例; T&GT;
为 T
但我stucked如何实现它在一个整洁的方式没有大量的铸件。
But I stucked how to implement it in a neat way without a lot of castings.
任何想法?
更新: 我以前用的是下面的$ C $下发现的类型与我的previous服务定位在注册他们:
UPDATE: I used to use the following code for discovering types for registring them with my previous service locator:
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);
}
}
看来我真的不明白反射泛型
It seems that I don't really understand reflection with generics
推荐答案
下面是一个整洁的解决方案,如果有定位器为单是罚款:
Here is a neat solution if having the locator as singleton is fine:
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;类型,对象&gt;并做一些强制转换:
If you cannot implement the locator as singleton, I believe there is no there around creating a Dictionary<Type,object> and do some casts:
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)];
}
}
这篇关于服务定位为仿制药的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!