服务定位为仿制药

2023-09-03 07:28:34 作者:想做先生的私有物

我说十几种 T EntityObject 的IDataObject 。 我一般如下界面

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)];
    }
}
相关推荐