Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IOC容器作为映射解析器_C#_Unity Container_Ioc Container - Fatal编程技术网

C# 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

我想使用IOC容器作为解析器函数查找

这就是我所拥有的

 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.根据组件是否注册,标准解析方法不应实现两种不同的行为。相反,工厂行为应该存在于一个单独的方法中,以便开发人员可以控制何时使用它或不使用它。解决已注册服务中未注册的依赖关系非常糟糕。生命周期将与服务相同,而不是执行未注册类型的显式解析的瞬时生命周期。