2

対処方法:

現在のコードは次のようになります。

class Class1 : ISomeInterface
    IFooService _service;
    void SomeMethod(){
        _service = new FooService(this);
        .....
}

class FooService : IFooService
    public FooService(ISomeInterface class1Implementer)
    {
        _class1Implementer = class1Implementer
    }

FooService を Autofac で Class1 に注入したいと考えています。この登録はどのように行われますか? ありがとう。

4

1 に答える 1

2

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<..>に一致するように型を自動的に解決します。IFooServiceISomeInterface

更新:コメントで進行中の議論に関連しています。実装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>デリゲートを機能させるために追加の登録は必要ありません。

于 2010-10-14T08:47:24.193 に答える