1

我说过十几种T继承自EntityObjectand的类型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>for 的实例T

但是我坚持如何在没有大量铸件的情况下以一种简洁的方式实现它。

有任何想法吗?

更新:我曾经使用以下代码来发现类型,以便使用我以前的服务定位器注册它们:

 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);
                }
            }

看来我不太了解泛型的反射

4

1 回答 1

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;
    }
}

如果您不能将定位器实现为单例,我相信创建 Dictionary<Type,object> 并进行一些强制转换:

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)];
    }
}
于 2010-04-16T21:05:24.033 回答