IOC 容器作为映射解析器
IOC container as mapping resolver
我想使用 IOC 容器,最好是 unity 作为解析器函数查找
这是我的
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);
}
}
我想要的是这样的:
IocContainer.Register(typeof(Monkey), typeof(MonkeyHandler ))
public void OnMessage(ParmaterType type)
{
((Handler) (IocContainer.Resolve(type)).HandleMessage(type);
}
诀窍是使界面通用:
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);
是的。我们有一个目标!
要删除从对象转换到处理程序中键入的重复性任务,您可以创建一个基础 class:
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)
{
}
}
我想使用 IOC 容器,最好是 unity 作为解析器函数查找
这是我的
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);
}
}
我想要的是这样的:
IocContainer.Register(typeof(Monkey), typeof(MonkeyHandler ))
public void OnMessage(ParmaterType type)
{
((Handler) (IocContainer.Resolve(type)).HandleMessage(type);
}
诀窍是使界面通用:
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);
是的。我们有一个目标!
要删除从对象转换到处理程序中键入的重复性任务,您可以创建一个基础 class:
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)
{
}
}