Ale*_*lex 3 ioc-container autofac
使用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"));
Run Code Online (Sandbox Code Playgroud)
但是,我需要使用属性注入,我不想指定所有依赖项.
就像是:
builder.Register<CustomerRepository>().With<IObjectContainer>("CustomerObjectContainer");
builder.Register<FooRepository>().With<IObjectContainer>("FooObjectContainer");
Run Code Online (Sandbox Code Playgroud)
所有未指定的依赖项的构建应该在未命名的实例中发生.
谢谢,亚历克斯
[丹尼尔克回答]
对于该类型的任何属性,按类型解析的重载.
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)));
}
Run Code Online (Sandbox Code Playgroud)
我不认为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)));
}
Run Code Online (Sandbox Code Playgroud)
不介意超长方法签名,autofac注册非常冗长.
您可以像这样使用扩展名.
builder.RegisterType<Foo>()
.WithResolvedProperty("Bar", c => c.Resolve<IBar>());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6823 次 |
| 最近记录: |