1
我试图转换一个工厂类,该工厂类获取某种类型的消息,并将该消息类型的处理器解析为实现Typed Factory Facility。Windsor 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());
}
}
基础上,从温莎城堡下面blogpost和documentation我创建了以下内容:
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[]'.
什么我做错了,代码如何改进?
我改变了'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