3

Ninject から Autofac への移行を検討していますが、便利な機能の 1 つである属性による制約付きバインディングを変換するのに苦労しています。

私は現在、このインターフェースと実装を持っています:

public interface IRepository
{
   IEnumerable<SomeObject> Get();
}

public class DBRepository : IRepository
{
   public IEnumerable<SomeObject> Get()
   {
    // call the database
   }
}

キャッシュをチェックインするキャッシュされた実装があり、何も見つからない場合は、db リポジトリを呼び出します。これはコンストラクターに渡されます。

[DataNeeded]
public class CacheRepository : IRepository
{
    private readonly IRepository dataRepo;

    public CacheRepository(IRepository dataRepo)
    {
        this.dataRepo = dataRepo;
    }

    public IEnumerable<SomeObject> Get()
    {
        // check the cache and if nothing found:
        return this.dataRepo.Get();
    }
}

最後に、キャッシュを使用してオブジェクトを取得する呼び出しコントローラーがあります。

[CacheNeeded]
public class HomeController : ApiController
{
    private readonly IRepository cacheRepo;

    public CacheRepository(IRepository cacheRepo)
    {
        this.cacheRepo= cacheRepo;
    }

    public IEnumerable<SomeObject> Get()
    {
       return this.cacheRepo.Get();
    }
}

ご覧のとおり、インターフェイスを再利用して、データ リポジトリにキャッシュ レイヤーを追加しました。このパターンは非常にうまく機能します。次に、いくつかのカスタム属性を使用して、特定のタイプの IRepository が必要であることを Ninject に伝えました。これは次のように構成されます。

kernel.Bind<IRepository>().To<DbRepository>().WhenClassHas<DataNeeded>();
kernel.Bind<IRepository>().To<CacheRepository>().WhenClassHas<CacheNeeded>();

Autofac でこの動作を模倣する方法はありますか?

4

1 に答える 1

0

Autofac を使用したこのようなメカニズムのきちんとした簡潔な実装は考えられませんが、Autofac の実装の選択の意味の1 つを利用できるかもしれません。私はキー付きサービスを使用します。あなたの場合は次のようになります。最初に、カスタム属性の代わりに、列挙型を定義する必要があります

enum RepositoryKind {CacheNeeded, DataNeeded}

次に、キャッシュまたはデータ機能を提供するものでそれらをマークするコンポーネントを登録します。たとえば、次のようになります。

  builder.RegisterType<DbRepository>()
         .Keyed<IRepository>(RepositoryKind.CacheNeeded);

  builder.Register(c => new CacheRepository(c.ResolveKeyed<IRepository(RepositoryKind.CacheNeeded)))
         .Keyed<IRepository>(RepositoryKind.DataNeeded);

  builder.Register(c => new HomeController(c.ResolveKeyed<IRepository>(RepositoryKind.DataNeeded)));

このようなアプローチの利点は、コントローラーで実装の詳細を明らかにせず、構成でキャッシュを適用することです。

于 2013-08-13T08:05:09.810 に答える