我有一个包含多个子目录的目录:
/Xml
/Documents
/Registrations
/Stuff
/...用户可以将xml文件放到这些子目录中,并且我有一个反应性的FileSystemWatcher在一些不活动的时间后捕获文件(以确保这些文件已经准备好处理)。
"Documents“文件夹需要一个与其他文件夹不同的过程,因此我创建了两个继承相同接口的组件:
public interface IXmlMessageHandler { void ProcessMessage(FileInformation fi); }
public class DocumentsXmlMessageHandler: IXmlMessageHandler { /* SNIP ... */ }
public class DefaultXmlMessageHandler: IXmlMessageHandler { /* SNIP ... */ }我已经习惯了城堡v3.2中的类型化工厂,所以当需要路由某些行为时,我决定使用我通常使用的模式:注册一个Null all组件作为默认值,然后为特定的行为提供额外的组件(讨论Null对象模式的下面是一个例子)。不同之处在于,我需要按文件夹而不是按类型进行路由,但是类型化的工厂允许您在解析时定义组件名称,从而很容易做到这一点。我想的是创建一个组件,它的名称可以与链接到的文件夹相匹配,当找到一个不匹配的文件夹时,默认的名称会弹出。
因此,我创建了一个类型的工厂,工厂选择器,并注册了我的组件。
public interface IXmlMessageHandlerFactory {
IXmlMessageHandler RetrieveMessageHandler(FileInformation fi);
}
public class XmlHandlerFactorySelector : DefaultTypedFactoryComponentSelector {
protected override string GetComponentName(System.Reflection.MethodInfo method, object[] arguments) {
return (arguments[0] as FileInformation).FolderName.ToLower();
}
}
Classes.FromAssemblyInThisApplication()
.BasedOn<IXmlMessageHandler>().WithService.AllInterfaces()
.Configure(c => {
var name = c.Implementation.Name.Replace("XmlMessageHandler", string.Empty).ToLower();
c.Named(name);
if (name == "default")
{
c.IsDefault();
}
})当我用来自"Documents“目录的FileInformation调用类型化工厂时,组件将被正确解析。但是,当我用其他目录名调用类型化工厂时,它会失败,因为它找不到名称,但它似乎没有考虑到这样一个事实,即存在一个与其匹配的默认实现。
如果找不到默认组件的名称,是否有任何方法来管理组件的命名解析,并在默认组件上进行回退?
发布于 2014-05-26 08:14:54
在城堡破变 V3的txt文件中,对这个问题有一个明确的引用:
在按名称解析组件时使用
DefaultTypedFactoryComponentSelector的更改类型工厂不会退回到按类型解析,如果找不到具有该名称的组件,则会抛出异常。
描述--在未注册命名组件或名称拼写错误以及选择错误组件时,v2.5中的原始行为可能导致错误,从而导致应用程序中潜在的严重问题。在这些情况下,新版本采用了快速失败的方法,以便给开发人员即时反馈,配置是错误的。
修复-实际修复取决于您想要的行为的哪一部分:
.AsFactory(new DefaultTypedFactoryComponentSelector(fallbackToResolveByTypeIfNameNotFound: true));时显式地指定它。我真的不喜欢这样做,因为这个属性被标记为只为了向后兼容性而存在,并且它的使用不被推荐,但至少它是有效的。
如果你知道更好的方法,我很想听听:)
发布于 2014-05-25 19:20:21
换个定制的选择器怎么样?创建一个实现ITypedFactoryComponentSelector的类并将其链接到您的类型化工厂。
ITypedFactoryComponentSelector提供了更多的灵活性:您可以通过func作为返回参数访问容器。
https://stackoverflow.com/questions/23831276
复制相似问题