Class1
データ (それ自体への参照) を 'IFooService` に提供するため、それらのデータを受け入れるファクトリ デリゲートを導入する必要があります。次のコードを検討してください。
class Class1 : ISomeInterface
{
private readonly IFooService _service;
public Class1(Func<ISomeInterface, IFooService> fooServiceFactory)
{
_service = fooServiceFactory(this);
.....
}
}
これで、登録は次のように簡単になります。
var builder = new ContainerBuilder();
builder.RegisterType<Class1>().As<ISomeInterface>();
builder.RegisterType<FooService>().As<IFooService>();
var container = builder.Build();
var something = container.Resolve<ISomeInterface>();
Autofac は、型とコンストラクターのパラメーターFunc<..>
に一致するように型を自動的に解決します。IFooService
ISomeInterface
更新:コメントで進行中の議論に関連しています。実装SomeMethod
からの分離:ISomeInterface
// Class1 is now oblivious to IFooService
class Class1 : ISomeInterface
{
public Class1()
{
}
}
// Class2 now holds the SomeMethod logic
class Class2 : ISomeOtherInterface
{
private readonly IFooService _fooService;
public Class2(IFooService fooService)
{
_fooService = fooService;
}
public void SomeMethod()
{
// do something with _fooService
}
}
SomeMethod
分離できない場合Class1
でも、工場の代替品を使用します. これはわずかな変更ですが、IFooService
実際に必要になるまで、つまり がSomeMethod
呼び出されるまで解決されません。
class Class1 : ISomeInterface
{
private readonly Func<ISomeInterface, IFooService> _fooServiceFactory;
public Class1(Func<ISomeInterface, IFooService> fooServiceFactory)
{
_fooServiceFactory = fooServiceFactory;
}
void SomeMethod()
{
var fooService = _fooServiceFactory(this);
....
}
}
ここでも Autofac の工場出荷時の機能が光ります。Func<ISomeInterface, IFooService>
デリゲートを機能させるために追加の登録は必要ありません。