autofac - 如果在 Autofac 中找不到匹配的寄存器,如何使用默认类进行解析

标签 autofac

我使用以下代码进行注册:

builder.RegisterType<QCatVCardParser>().Named<IQCatParser>(".VCF");              
builder.RegisterType<QCatVCardParser>().Named<IQCatParser>(".VCARD");            
builder.RegisterType<QCatOutlookMessageParser>().Named<IQCatParser>(".MSG");
builder.RegisterType<QCatMimeMessageParser>().Named<IQCatParser>(".EML");
builder.RegisterType<QCatCalendarParser>().Named<IQCatParser>(".ICS");
container = builder.Build();

要检索类引用,我使用以下代码:

var r = container
    .ResolveNamed<IQCatParser>(Path.GetExtension(fileName).ToUpperInvariant());

现在我的问题是,如果出现不受支持的文件扩展名,比如说 .DOC,我想使用其中一个注册类中的组件或使用第一个注册类来解决它。

可以使用 AutoFac 做到这一点吗?

最佳答案

您可以使用 Autofac 来完成此操作。您需要创建一个可以在需要时提供默认注册的 IRegistrationSource。例如,以下是提供设置类的源的 RegistrationsFor 代码:

var typedService = service as IServiceWithType;
if (typedService != null && typedService.ServiceType.IsClass && typeof(ISettings).IsAssignableFrom(typedService.ServiceType))
{
    yield return RegistrationBuilder.ForDelegate((c, p) => c.Resolve<ISettingsReader>().Load(typedService.ServiceType))
                .As(typedService.ServiceType)
                .CreateRegistration();
}

然后,在模块内部或直接使用 Autofac 构建器,调用 RegisterSource 来连接新的注册源。

关于autofac - 如果在 Autofac 中找不到匹配的寄存器,如何使用默认类进行解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11310352/

相关文章:

c# - 在 Autofac : What is the difference between a Service and a Component? 的上下文中

c# - 属性注入(inject)的值在构造函数中为空

c# - Autofac 注册程序集类型

c# - Autofac - 使用多重实现

c# - Autofac WcfIntegration - 通过 net.tcp 通信时无法激活 WCF 客户端服务

c# - 翻译 ninject ISecureDataFormat 绑定(bind)到 Autofac

c# - 防止 Autofac 持有一次性实例

mysql - IDbConnection 与 .Net Core 中的 MySql - 无法使用 autofac 注入(inject)

c# - Autofac 枚举不适用于类型或模块的多个注册

c# - 重新注入(inject)新反序列化对象的依赖项