使用 Autofac 将组件 属性 注入到另一个组件的构造函数参数中
Inject a component property into another component's constructor parameter with Autofac
使用 Autofac IoC 容器,假设有以下场景:
public interface IHaveASpecialProperty
{
SpecialType SpecialProperty { get; }
}
public class HaveASpecialPropertyImpl : IHaveASpecialProperty
{
// implementation
}
public class SomeComponent
{
public SomeComponent(SpecialType special)
{
_special = special;
// rest of construction
}
private readonly SpecialType _special;
// implementation: do something with _special
}
// in composition root:
containerBuilder.RegisterType<HaveASpecialPropertyImpl>
.As<IHaveASpecialProperty>();
containerBuilder.RegisterType<>(SomeComponent);
有没有办法在 Autofac 容器中注册 HaveASpecialPropertyImpl
类型作为 SpecialType
实例的一种提供者/工厂?
我目前拥有的是这种经典方法:
public class SomeComponent
{
public SomeComponent(IHaveASpecialProperty specialProvider)
{
_special = specialProvider.SpecialProperty;
// rest of construction
}
private readonly SpecialType _special;
// implementation: do something with _special
}
原理基本上与得墨忒耳法则有关:specialProvider
只是用来抓取一个SpecialType
实例,而不是实际依赖SomeComponent
需要和使用,因此只注入 SpecialType
实例似乎是合理的,而不考虑 SomeComponent
该实例的来源。
PS:我读过关于 Delegate Factories 的文章,不确定那是否是(唯一的?)方法。
您可以注册一个代表:
builder.Register(c => c.Resolve<IHaveASpecialProperty>().SpecialProperty)
.As<ISpecialType>();
使用此注册,每次您将解析一个 ISpecialType
Autofac 将解析一个 IHaveASpecialProperty
和 return SpecialProperty
属性 值为 ISpecialType
.
使用 Autofac IoC 容器,假设有以下场景:
public interface IHaveASpecialProperty
{
SpecialType SpecialProperty { get; }
}
public class HaveASpecialPropertyImpl : IHaveASpecialProperty
{
// implementation
}
public class SomeComponent
{
public SomeComponent(SpecialType special)
{
_special = special;
// rest of construction
}
private readonly SpecialType _special;
// implementation: do something with _special
}
// in composition root:
containerBuilder.RegisterType<HaveASpecialPropertyImpl>
.As<IHaveASpecialProperty>();
containerBuilder.RegisterType<>(SomeComponent);
有没有办法在 Autofac 容器中注册 HaveASpecialPropertyImpl
类型作为 SpecialType
实例的一种提供者/工厂?
我目前拥有的是这种经典方法:
public class SomeComponent
{
public SomeComponent(IHaveASpecialProperty specialProvider)
{
_special = specialProvider.SpecialProperty;
// rest of construction
}
private readonly SpecialType _special;
// implementation: do something with _special
}
原理基本上与得墨忒耳法则有关:specialProvider
只是用来抓取一个SpecialType
实例,而不是实际依赖SomeComponent
需要和使用,因此只注入 SpecialType
实例似乎是合理的,而不考虑 SomeComponent
该实例的来源。
PS:我读过关于 Delegate Factories 的文章,不确定那是否是(唯一的?)方法。
您可以注册一个代表:
builder.Register(c => c.Resolve<IHaveASpecialProperty>().SpecialProperty)
.As<ISpecialType>();
使用此注册,每次您将解析一个 ISpecialType
Autofac 将解析一个 IHaveASpecialProperty
和 return SpecialProperty
属性 值为 ISpecialType
.