首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果城堡中不存在名称,则使用默认回退按名称解析组件

如果城堡中不存在名称,则使用默认回退按名称解析组件
EN

Stack Overflow用户
提问于 2014-05-23 14:01:10
回答 2查看 1.1K关注 0票数 0

我有一个包含多个子目录的目录:

代码语言:javascript
复制
/Xml
  /Documents
  /Registrations
  /Stuff
  /...

用户可以将xml文件放到这些子目录中,并且我有一个反应性的FileSystemWatcher在一些不活动的时间后捕获文件(以确保这些文件已经准备好处理)。

"Documents“文件夹需要一个与其他文件夹不同的过程,因此我创建了两个继承相同接口的组件:

代码语言:javascript
复制
public interface IXmlMessageHandler { void ProcessMessage(FileInformation fi); }

public class DocumentsXmlMessageHandler: IXmlMessageHandler { /* SNIP ... */ }

public class DefaultXmlMessageHandler: IXmlMessageHandler { /* SNIP ... */ }

我已经习惯了城堡v3.2中的类型化工厂,所以当需要路由某些行为时,我决定使用我通常使用的模式:注册一个Null all组件作为默认值,然后为特定的行为提供额外的组件(讨论Null对象模式的下面是一个例子)。不同之处在于,我需要按文件夹而不是按类型进行路由,但是类型化的工厂允许您在解析时定义组件名称,从而很容易做到这一点。我想的是创建一个组件,它的名称可以与链接到的文件夹相匹配,当找到一个不匹配的文件夹时,默认的名称会弹出。

因此,我创建了一个类型的工厂,工厂选择器,并注册了我的组件。

代码语言:javascript
复制
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调用类型化工厂时,组件将被正确解析。但是,当我用其他目录名调用类型化工厂时,它会失败,因为它找不到名称,但它似乎没有考虑到这样一个事实,即存在一个与其匹配的默认实现。

如果找不到默认组件的名称,是否有任何方法来管理组件的命名解析,并在默认组件上进行回退?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-26 08:14:54

在城堡破变 V3的txt文件中,对这个问题有一个明确的引用:

在按名称解析组件时使用DefaultTypedFactoryComponentSelector的更改类型工厂不会退回到按类型解析,如果找不到具有该名称的组件,则会抛出异常。

  • id -
  • 影响-介质
  • 可修复性-容易

描述--在未注册命名组件或名称拼写错误以及选择错误组件时,v2.5中的原始行为可能导致错误,从而导致应用程序中潜在的严重问题。在这些情况下,新版本采用了快速失败的方法,以便给开发人员即时反馈,配置是错误的。

修复-实际修复取决于您想要的行为的哪一部分:

  • 如果您确实关心回退行为,即按名称获取组件,如果不存在按类型解析的回退,则可以在注册工厂:.AsFactory(new DefaultTypedFactoryComponentSelector(fallbackToResolveByTypeIfNameNotFound: true));时显式地指定它。

我真的不喜欢这样做,因为这个属性被标记为只为了向后兼容性而存在,并且它的使用不被推荐,但至少它是有效的。

如果你知道更好的方法,我很想听听:)

票数 2
EN

Stack Overflow用户

发布于 2014-05-25 19:20:21

换个定制的选择器怎么样?创建一个实现ITypedFactoryComponentSelector的类并将其链接到您的类型化工厂。

ITypedFactoryComponentSelector提供了更多的灵活性:您可以通过func作为返回参数访问容器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23831276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档