使用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
}
基本原理与Demeter法基本相关:specialProvider
仅用于获取SpecialType
实例,而SomeComponent
实例需要{{>>实际依赖关系。 {1}},所以只注入SpecialType
个实例似乎是合理的,而不关心SomeComponent
该实例的来源。
PS:我读过关于Delegate Factories的内容,不确定这是否是(仅限?)方式。
答案 0 :(得分:1)
您可以注册代表:
builder.Register(c => c.Resolve<IHaveASpecialProperty>().SpecialProperty)
.As<ISpecialType>();
使用此注册,每次您解析ISpecialType
Autofac 将解析IHaveASpecialProperty
并将SpecialProperty
属性值返回为ISpecialType