【发布时间】:2015-08-02 00:13:22
【问题描述】:
我目前有一个 ASP.Net MVC 5 应用程序,它使用 3 个外部数据源(对外部 API 进行调用,对响应进行反序列化,并映射到业务 POCO)。
该应用目前使用 SimpleInjector 将每个数据源的具体存储库注入到业务逻辑层以供使用。
问题是,随着更多数据源的添加(可能是 20-30 个),构造函数将非常庞大,注入所有这些存储库似乎很麻烦。
是否有更好的模式/方法来使用所有数据源而不是使用不同的存储库?
外观或其他模式更合适吗?
非常通用的例子:
public class MyObject(){
public IEnumerable<Cat> Cats { get; set; }
public IEnumerable<Dog> Dogs { get; set; }
public IEnumerable<Fish> Fish { get; set; }
}
public class BusinessLogic{
private readonly ISourceARepository _sourceA;
private readonly ISourceBRepository _sourceB;
private readonly ISourceCRepository _sourceC;
public BusinessLogic(ISourceARepository sourceA, ISourceBRepository sourceB, ISourceCRepository sourceC){
_sourceA = sourceA;
_sourceB = sourceB;
_sourceC = sourceC;
}
private Dog MapSourceARecordToDog(SourceARecord record){
var result = new Dog();
if(record != null){
result.Name = record.NameField;
result.Age = record.Age;
}
return result;
}
private Cat MapSourceBRecordToCat(SourceBRecord record){
var result = new Cat();
if(record != null){
result.Name = record.NameField;
result.Weight = record.WeightField;
}
return result;
}
private Fish MapSourceCRecordToFish(SourceCRecord record){
var result = new Fish();
if(record != null){
result.ID = record.IDField;
result.Name = record.NameField;
}
return result;
}
public MyObject GetResults(){
var result = new MyObject();
result.Dogs = _sourceA.GetAll().Select(MapSourceARecordToDog).ToList();
result.Cats = _sourceB.GetAll().Select(MapSourceBRecordToCat).ToList();
result.Fish = _sourceC.GetAll().Select(MapSourceCRecordToFish).ToList();
return result;
}
}
public class SourceARespository : ISourceARepository{
public IEnumerable<SourceAResult> GetAll(){
return new List<SourceAResult>();
}
}
public class SourceBRespository : ISourceBRepository{
public IEnumerable<SourceBResult> GetAll(){
return new List<SourceBResult>();
}
}
public class SourceCRespository : ISourceCRepository{
public IEnumerable<SourceCResult> GetAll(){
return new List<SourceCResult>();
}
}
更新: 这不是构造函数疯狂问题的重复,因为在这种情况下,一个类需要许多不同的数据源,但仍具有单一职责。因此,它需要自己的解释和回答。
【问题讨论】:
-
具体的存储库是什么样的?你能举一个这种实现的例子吗?
-
添加了一个通用示例。
-
业务对象中是否同时需要所有三种类型的存储库?
-
我不确定 SimpleInjector 是否允许属性注入。这将为您解决一个负担。
标签: c# asp.net asp.net-mvc design-patterns