IOC容器作为映射解析器

时间:2015-12-02 17:22:19

标签: c# unity-container ioc-container

我想使用IOC容器,最好使用unity作为解析器函数查找

这就是我所拥有的

10

我想要的是这样的:

 class ParmaterType {}

 class Monkey : ParmaterType {}
 class Handler {virtual void HandleMessage(){}}
 class MonkeyHandler : Handler {}

 class Main
 {
    Dictionary<Type, Type> _Mapper= new> Dictionary<Type, Type >()
    {  { typeof(Monkey) , typeof(MonkeyHandler) } }; 

   public void OnMessage(ParmaterType  type)
    {  
       Handler instance = (Handler)Activator.CreateInstance(_Mapper[type]); 
       instance.HandleMessage(type); 
     } 
 }

1 个答案:

答案 0 :(得分:4)

诀窍是使界面通用:

public interface IMessageHandler<T>
{
    void Handle(T message);
}

public class MonkeyHandler : IMessageHandler<Monkey>
{
    public void Handle(Monkey message) {}
}

要解决处理程序,只需执行以下操作:

var monkeyHandler = yourContainer.Resolve<IMessageHandler<Monkey>>();

问题在于,如果您收到object消息,则无法在编译时从对象转换为泛型。

object message = endPoint.Recieve();

//not fun to do this:
if (message is Monkey)
   container.Resolve<IMessageHandler<Monkey>>((Monkey)message);

相反,您需要从对象转换为类型处理程序。

public interface IMessageHandler
{
    void Handle(object message);
}
public interface IMessageHandler<T> : IMessageHandler
{
    void Handle(T message);
}

public class MonkeyHandler : IMessageHandler<Monkey>
{
    public void Handle(Monkey message) {}

    //hide from the public API
    void IMessageHandler.Handle(object message)
    {
        Handle((Monkey)message);
    }
}

..这意味着您现在可以使用Type

找到它
var genericInterfaceType = typeof(IMessageHandler<>).MakeGenericType(message.GetType());
var handlerObj = container.Resolve(genericInterfaceType);

..以便您可以将其强制转换为基接口并调用它:

var handler = (IMessageHandler)handlerObj;
handler.Handle(message);

耶。我们得到了一个目标!

要删除从对象转换到处理程序中键入的重复任务,您可以创建基类:

public abstract class HandlerBase<T> : IMessageHandler<T>
{
    public abstract void Handle(Monkey message);

    void IMessageHandler.Handle(object message)
    {
        Handle((T)message);
    }
}

public class MonkeyHandler : HandlerBase<Monkey>
{
    public override void Handle(Monkey message) 
    {
    }
}