我有一種情況使用存儲庫模式,我想有一些額外的存儲庫不對應任何實體。註冊派生的存儲庫立即實現接口
例如這裏是一個沒有:
public class TargetRepository : RepositoryBase<Target>, ITargetRepository
{
public TargetRepository(IDatabaseFactory databaseFactory)
:base(databaseFactory)
{
}
public IEnumerable<Target> GetValidTargets(){ ... }
}
public interface ITargetRepository : IRepository<Target>
{
IEnumerable<Target> GetValidTargets();
}
凡Target
是一個實體。
然後,我想有一些其他的存儲庫這樣的:
public class ScatterPlotRepositoryProxy : TargetRepository, IScatterPlotRepositoryProxy
{
public ScatterPlotRepositoryProxy(IDatabaseFactory databaseFactory)
:base(databaseFactory)
{ }
public IEnumerable<ScatterPlotModel> GetSavedScatterPlots() {
this.GetValidTargets().Select(t => new ScatterPlotModel{ ... });
}
}
public interface IScatterPlotRepositoryProxy
{
IEnumerable<ScatterPlotModel> GetSavedScatterPlots()
}
聲明本來自一個不TargetRepository
如何RepositoryBase<Entity>
繼承。這是因爲ScatterPlotModel
不是一個實體,甚至沒有持續。但是,我想要另一層分離,以便我的TargetRespository
不會因爲所有不同圖表類型的方法而變得混亂。
我還沒有實際執行這個,所以沒有錯誤呢。但我預見我的Autofac DI電話會在稍後導致問題,所以我提前詢問。
我該如何正確地使用Autofac註冊這些「存儲庫代理」?目前,我有這樣的:
builder.RegisterAssemblyTypes(typeof(TargetRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerApiRequest();
,加入這似乎是它會衝突:
builder.RegisterAssemblyTypes(typeof(TargetRepository).Assembly).Where(t => t.Name.EndsWith("RepositoryProxy")).AsImplementedInterfaces().InstancePerHttpRequest();
我會得到我所期望的行爲(IScatterPlotRepositoryProxy
將解析爲ScatterPlotRepositoryProxy
和ITargetRepository
應該繼續,儘管解析到TargetRepository
ScatterPlotRepositoryProxy
也從基礎知識庫中實現它)?
試圖從程序集中完成所有操作,以避免爲每個存儲庫添加行。
這是一個很好的文章,你是一個非常熟練的程序員。它非常適合我現有的命令體系結構。現貨,謝謝! – parliament
Btw不得不在您的答案中將'AsImplementedInterface()'添加到'IRepository <>'配置中以使其工作。再次感謝 – parliament
@Vazgen:我根本不是一位有經驗的Autofac用戶,所以請隨時更新我的答案和更正。這也可以幫助其他開發者。 – Steven