我正在考虑从 Ninject 转移到 Autofac,但正在努力翻译其中一个有用的功能——通过属性进行约束绑定。
我目前有这个接口和实现:
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();
}
}
正如你所看到的,我重用了接口在数据存储库上添加了一个缓存层,这种模式工作得非常巧妙。然后我使用了一些自定义属性来告诉 Ninject 我需要某种类型的 IRepository。这配置如下:
kernel.Bind<IRepository>().To<DbRepository>().WhenClassHas<DataNeeded>();
kernel.Bind<IRepository>().To<CacheRepository>().WhenClassHas<CacheNeeded>();
有没有办法在 Autofac 中模仿这种行为?