1

我正在设计一个系统,该系统能够基于特定(基于字符串)MessageType 处理基于类型和基于 xml 的消息。理想情况下,为了处理这些消息,我想使用一系列提供者,例如:

[MessageType("CreateWorkOrder")]
public class CreateWorkOrderMessageProcessingProvider: IMessageProcessingProvider
{
    ...

然后在 Windsor 中按名称“CreateWorkOrder”解决。我想知道是否可以使用以下变体按名称注册(使用 MessageType 属性):

container.Register(Classes.FromAssemblyContaining<IMessageProcessingProvider>().Where(t => Attribute.IsDefined(t, typeof(MessageTypeAttribute))));

还是我需要提供自定义解析器?如果有更好的模式可以在这里实现,我很高兴听到它。

4

1 回答 1

2

您可以使用该Configure()方法对 Windsor 构建的 ComponentModel 进行此类自定义。这是一个查找属性值并将其分配给名称的示例,但此代码中没有错误检查(并且假设该属性公开了一个Name属性):

container.Register(
    Classes.FromAssemblyContaining<IMessageProcessingProvider>()
        .Where(t => Attribute.IsDefined(t, typeof (MessageTypeAttribute)))
        .Configure(c =>
                    {
                        var name =
                            ((MessageTypeAttribute)
                             c.Implementation.GetCustomAttributes(typeof (MessageTypeAttribute), false)[0]).Name;
                        c.Named(name);
                    }));
于 2012-10-17T00:02:45.957 回答