我有一种使用存储库模式的情况,我希望有一些不对应于任何实体的额外存储库。
例如,这是一个:
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
not继承的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
也从基本存储库实现它)?
尝试从程序集中一次性完成所有操作,以避免必须为每个存储库添加行。