我目前有一个ASP.Net MVC 5应用程序,它使用3个外部数据源(调用外部API,反序列化响应并映射到业务POCO)。
该应用程序当前使用SimpleInjector将每个数据源的具体存储库注入到业务逻辑层以供使用。
问题是,随着更多的数据源被添加(可能达到20-30个),构造函数会变得非常庞大,并且注入所有这些存储库似乎很麻烦。
除了使用不同的存储库之外,是否有更好的模式/方法来使用所有数据源?
门面或其他模式是否更合适?
非常通用的示例:
更新: 这不是构造函数混乱问题的重复,因为在这种情况下,一个类需要许多不同的数据源,但仍然具有单一职责。因此,它值得拥有自己的解释和答案。
该应用程序当前使用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>();
}
}
更新: 这不是构造函数混乱问题的重复,因为在这种情况下,一个类需要许多不同的数据源,但仍然具有单一职责。因此,它值得拥有自己的解释和答案。