Autofac:解决对命名实例的特定依赖关系

2024-04-29

使用 Autofac,我想注册一个组件并指定要解析为命名实例的特定依赖项。

我使用构造函数注入找到了如下示例,这几乎就是我想要的。

builder.Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

builder.Register(c => new ObjectContainer(ConnectionStrings.FooDB))
    .As<IObjectContainer>()
    .Named("FooObjectContainer");

builder.Register(c => new CustomerRepository(
    c.Resolve<IObjectContainer>("CustomerObjectContainer"));

builder.Register(c => new FooRepository(
    c.Resolve<IObjectContainer>("FooObjectContainer"));

但是,我需要属性注入,并且我不想指定所有依赖项。

就像是:

builder.Register<CustomerRepository>().With<IObjectContainer>("CustomerObjectContainer");    
builder.Register<FooRepository>().With<IObjectContainer>("FooObjectContainer");

所有未指定依赖项的构建都应该在未命名实例中进行。

谢谢, 亚历克斯

[丹尼尔格的回答补充]

按类型解析该类型的任何属性的重载。

    public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithDependency<TLimit, TReflectionActivatorData, TStyle, TProperty>(
        this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration,
        Func<IComponentContext, TProperty> valueProvider)
        where TReflectionActivatorData : ReflectionActivatorData
    {
        return registration.WithProperty(new ResolvedParameter((p, c) =>
            {
                PropertyInfo prop;
                return p.TryGetDeclaringProperty(out prop) &&
                    prop.PropertyType == typeof(TProperty);
            },
            (p, c) => valueProvider(c)));
    }

我认为 autofac 还没有一种快捷的方法来做到这一点,但是只需付出一点努力就可以实现。

我已经编写了一个扩展方法来执行此操作。将其放入静态扩展类中,应该没问题。该扩展还展示了如何长期执行此操作。

public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithResolvedProperty<TLimit, TReflectionActivatorData, TStyle, TProperty>(
    this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> registration,
    string propertyName, Func<IComponentContext, TProperty> valueProvider)
        where TReflectionActivatorData : ReflectionActivatorData
{
    return registration.WithProperty(new ResolvedParameter((p, c) =>
                                                               {
                                                                   PropertyInfo prop;
                                                                   return p.TryGetDeclaringProperty(out prop) &&
                                                                          prop.Name == propertyName;
                                                               },
                                                           (p, c) => valueProvider(c)));
}

不要介意超长的方法签名,autofac 注册非常冗长。

您可以像这样使用扩展。

builder.RegisterType<Foo>()
    .WithResolvedProperty("Bar", c => c.Resolve<IBar>());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autofac:解决对命名实例的特定依赖关系 的相关文章

随机推荐