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 でこの動作を模倣する方法はありますか?