用于泛型的服务定位器

时间:2010-04-16 20:56:30

标签: c# .net generics service-locator

我已经说过十几种类型T,它们继承自EntityObjectIDataObject。 我有以下接口的通用

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

似乎我并不真正理解泛型的反思

1 个答案:

答案 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)];
    }
}