2012-04-03 86 views
7

我有以下接口映射 - > IHandler <T>

public interface IHandler<T> 
{ 
    void Handle(T myObject); 
} 

我想有一个HandlersManager类持有其相应的处理程序对象类型之间的映射,但是我不知道我该如何定义持有这种映射的对象。

例如,我想有是这样的:

typeof(string) --> instance of IHandler<string> 
typeof(MyClass) --> instance of IHandler<MyClass> 

我有这么最好的事情远是定义为Dictionary<Type, object>的映射,但在这种情况下,我会投的价值每当我得到它时,我都会去IHandler<T>

有没有更好的解决方案或我完全错过了什么?

+1

如果'IHandler '继承了'IHandler',那么你可以有一个'的字典,就像'IEnumerable'一样发生' – Jodrell 2012-04-03 11:24:50

+2

@Jodrell由于IHandler是一个空接口,作为使用'对象',因为演员仍然是必需的。 – 2012-04-03 11:25:58

回答

5

这和只有通用的IHandler<T>界面一样好。

为了探索更多的选择,我们可以定义界面的非通用版本:

public interface IHandler 
{ 
    void Handler(object myObject); 
} 

然后,你还可以定义同时实现IHandler<T>IHandler一个通用的抽象基类:

public abstract class BaseHandler<T> : IHandler, IHandler<T> 
{ 
    public abstract void Handle(T myObject); 

    void IHandler.Handle(object myObject) 
    { 
     ((IHandler<T>)this).Handle((T) myObject); 
    } 
} 

在这一点上,你可以有一个IDictionary<Type, IHandler>,你可以直接调用你拉出来的值IHandler.Handle

var obj = /* whatever */ 
dictionary[obj.GetType()].Handle(obj); 

另一方面,我们现在有一个额外的接口和一个抽象基类,以隐藏来自“用户”代码的演员阵容,这听起来并不令人印象深刻。

10

我怀疑你正在使用它来解决依赖关系。相反,请使用专门的容器来处理这些问题。

如果你不想这样做,你想是这样的:

Dictionary<Type, object> dictionary; 

IHandler<T> Resolve<T>() { 
    return (IHandler<T>)dictionary[typeof(T)]; 
} 

没有泛型任何其他方式。

有没有更好的解决方案或我完全错过了什么?

不,但管理员类通常是代码异味。小心。

+0

听起来更像是一个工厂班而不是一个非特定的经理班,所以我不认为这里有一种气味。 – Rup 2012-04-03 11:33:52

+1

@RUP:坦率地说,我们都不知道没有看到上下文的用法。他称之为经理,看起来像解析器。这是一种气味,因为如果我有一个班级使用这位经理,我不知道具体的'IHandler '它正在解决,因此我不知道它依赖于什么'IHandler 。 – jason 2012-04-03 12:40:15