2011-04-26 118 views
1

我试图转换一个工厂类,该工厂类获取某种类型的消息,并将该消息类型的处理器解析为实现Typed Factory FacilityWindsor Generic Typed Factory

我,开始于代码是这样的:

public interface IProcessor<in T> where T : Message 
{ 
    void Process(T message); 
} 

public class ProcessorFactory : IProcessorFactory 
{ 
    private readonly IKernel _container; 

    public ProcessorFactory(IKernel container) 
    { 
     if (container == null) throw new ArgumentNullException("container"); 

     _container = container; 
    } 

    public void Process(Message message) 
    { 
     // Create a specific message processor type 
     var processorType = typeof(IProcessor<>).MakeGenericType(message.GetType()); 

     // Resolve all processors for that message 
     var processors = _container.ResolveAll(processorType); 

     foreach (var processor in processors) 
     { 
      processor.GetType().GetMethod("Process").Invoke(processor, new[] { message }); 
     } 
    } 

public class ProcessorInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
       Component.For<IProcessorFactory>().ImplementedBy<ProcessorFactory>(), 
       AllTypes.FromThisAssembly().BasedOn(typeof(IProcessor<>)).WithService.FirstInterface(). 
        AllowMultipleMatches()); 
    } 
} 

基础上,从温莎城堡下面blogpostdocumentation我创建了以下内容:

public interface IProcessor 
{ 
    void Process(); 
} 

public interface IProcessor<T> where T : Message 
{ 
    /// <summary> 
    /// Message to process 
    /// </summary> 
    T Message { get; set; } 
} 

public interface IProcessorFactory 
{ 
    IProcessor[] GetAllProcessorsForMessage(Message message); 
} 

public class ProcessorInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.AddFacility<TypedFactoryFacility>() 
      .Register(
       Component.For<ProcessorSelector, ITypedFactoryComponentSelector>(), 
       Component.For<AutoReleaseProcessorInterceptor>(), 

       AllTypes.FromThisAssembly() 
        .BasedOn(typeof(IProcessor<>)) 
        .WithService.Base() 
        .Configure(c => c.LifeStyle.Is(LifestyleType.Transient) 
         .Interceptors<AutoReleaseProcessorInterceptor>()), 

       Component.For<IProcessorFactory>().AsFactory(f => f.SelectedWith<ProcessorSelector>())); 
    } 
} 

public class ProcessorSelector : DefaultTypedFactoryComponentSelector 
{ 
    protected override Type GetComponentType(MethodInfo method, object[] arguments) 
    { 
     return typeof(IProcessor<>).MakeGenericType(arguments[0].GetType()); 
    } 
} 

当我打电话factory.GetAllProcessorsForMessage(new ExampleMessage())我得到的以下错误:

Unable to cast object of type 'Castle.Proxies.IProcessor`1Proxy' to type 'MyNamespace.Processors.IProcessor[]'.

什么我做错了,代码如何改进?

回答

1

这很简单。由于例外消息是说你的代理没有实现非通用的接口IProcessor接口。您也需要使它成为这些组件的服务。

此外,您的选择器告诉温莎你以后是一个单一的项目,而签名意味着你想要一个集合。因此,转换失败是因为您将单个项目转换为数组类型。

所以,你选择的方法应该有

.MakeArrayType()末。

+0

我改变了'public interface IProcessor where T:Message' to'public interface IProcessor :IP processor where T:Message' but the exception does not go away。 – Jochen 2011-04-27 07:21:42