C# IOC容器作为映射解析器
我想使用IOC容器作为解析器函数查找 这就是我所拥有的C# IOC容器作为映射解析器,c#,unity-container,ioc-container,C#,Unity Container,Ioc Container,我想使用IOC容器作为解析器函数查找 这就是我所拥有的 class ParmaterType {} class Monkey : ParmaterType {} class Handler {virtual void HandleMessage(){}} class MonkeyHandler : Handler {} class Main { Dictionary<Type, Type> _Mapper= new> Dictionary<Type
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);
}
}
诀窍是使接口通用:
public interface IMessageHandler<T>
{
void Handle(T message);
}
public class MonkeyHandler : IMessageHandler<Monkey>
{
public void Handle(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);
}
}
。。因此,您可以将其强制转换为基本接口并调用它:
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)
{
}
}
公共抽象类HandlerBase:IMessageHandler
{
公共摘要无效句柄(Monkey消息);
void IMessageHandler.Handle(对象消息)
{
句柄((T)消息);
}
}
公共类MonkeyHandler:HandlerBase
{
公共覆盖无效句柄(Monkey消息)
{
}
}
诀窍在于使界面通用:
public interface IMessageHandler<T>
{
void Handle(T message);
}
public class MonkeyHandler : IMessageHandler<Monkey>
{
public void Handle(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);
}
}
。。因此,您可以将其强制转换为基本接口并调用它:
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)
{
}
}
公共抽象类HandlerBase:IMessageHandler
{
公共摘要无效句柄(Monkey消息);
void IMessageHandler.Handle(对象消息)
{
句柄((T)消息);
}
}
公共类MonkeyHandler:HandlerBase
{
公共覆盖无效句柄(Monkey消息)
{
}
}
您需要一个处理程序接口,可以是通用接口,并为各自的处理程序类型注册处理程序。然后,根据消息类型,您需要向容器请求与消息类型对应的已注册处理程序类型(因此,通用处理程序类型使其更容易)。但是我是@stuartd,容器对于这样的职责来说太通用了,这里最好有一个合适的处理程序工厂。消息处理程序在不同的地方被拆分,并且不断添加,我不想使用字典,因为我添加的每一个新处理程序都必须到字典中添加它们,它们已经在IOC容器中注册。因此,这似乎是一个冗余,但您使用什么机制来动态地向IOC容器注册新的处理程序?我认为你应该能够融入其中,但如果不知道更多细节,很难说怎么做。远离Unity,这很糟糕。工厂方法可以存在于容器中,但它们应该是明确的。i、 e.根据组件是否注册,标准解析方法不应实现两种不同的行为。相反,工厂行为应该存在于一个单独的方法中,以便开发人员可以控制何时使用它或不使用它。解决已注册服务中未注册的依赖关系非常糟糕。生存期将与服务相同,而不是执行未注册类型的显式解析时的瞬态。您需要处理程序接口,可以是泛型接口,并为其各自的处理程序类型注册处理程序。然后,根据消息类型,您需要向容器请求与消息类型对应的已注册处理程序类型(因此,通用处理程序类型使其更容易)。但是我是@stuartd,容器对于这样的职责来说太通用了,这里最好有一个合适的处理程序工厂。消息处理程序在不同的地方被拆分,并且不断添加,我不想使用字典,因为我添加的每一个新处理程序都必须到字典中添加它们,它们已经在IOC容器中注册。因此,这似乎是一个冗余,但您使用什么机制来动态地向IOC容器注册新的处理程序?我认为你应该能够融入其中,但如果不知道更多细节,很难说怎么做。远离Unity,这很糟糕。工厂方法可以存在于容器中,但它们应该是明确的。i、 e.根据组件是否注册,标准解析方法不应实现两种不同的行为。相反,工厂行为应该存在于一个单独的方法中,以便开发人员可以控制何时使用它或不使用它。解决已注册服务中未注册的依赖关系非常糟糕。生命周期将与服务相同,而不是执行未注册类型的显式解析的瞬时生命周期。