gpt4 book ai didi

ioc-container - Autofac:解决对命名实例的特定依赖

转载 作者:行者123 更新时间:2023-12-04 05:32:55 25 4
gpt4 key购买 nike

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

我发现使用构造函数注入(inject)的示例如下所示,这几乎是我想要的。

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"));

但是,我需要通过属性注入(inject)实现这一点,并且我不想指定所有依赖项。

类似于:

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

所有未指定的依赖关系的构建应该发生在未命名的实例上。

谢谢,亚历克斯

[Danielg 的回答的补充]

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

    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>());

关于ioc-container - Autofac:解决对命名实例的特定依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9710779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com