我对如何解决/实施此类问题有疑问:
案例: 根据ID(来自HTTP请求),我需要从不同的存储库/数据库表中获取数据。
我使用通用存储库接口:
public interface IRepository<T>
{
IQueryable<T> GetAll();
// ...
}
让我烦恼的代码:
if (reportId == 2)
{
var repo = new Repository<EntityA>(_context);
var result = repo.GetAll().SingleOrDefault(x => x.Id == anotherId);
if (result == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
else if (reportId == 3)
{
var repo = new Repository<EntityB(_context);
var result = repo.GetAll().SingleOrDefault(x => x.Id == anotherId);
if (result == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
else if (reportId == 4)
{
var repo = new Repository<EntityC>(_context);
var result = repo.GetAll().SingleOrDefault(x => x.Id == anotherId);
if (result == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
else
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
这段代码很难看,并且有很多重复。
我想知道这个问题的最佳方法是什么。
我可能会为每个案例编写不同的方法,但这个解决方案感觉不对 因为它违反了DRY方法(以及这种&#39;硬编码的解决方案)。
同样拥有所有这些代码(或方法调用)似乎违反了SRP,它应该被分开。
任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
您可以应用下一次重构(基于&#34;提取方法&#34;):
public T FindEntityById<T>(ContextClass _context, int anotherId)
{
var repo = new Repository<T>(_context);
return repo.GetAll().SingleOrDefault(x => x.Id == anotherId);
}
// ... next your method
object result = null;
switch(reportId)
{
case 2:
result = FindEntityById<EntityA>(_context, anotherId);
break;
case 3:
result = FindEntityById<EntityB>(_context, anotherId);
break;
case 4:
result = FindEntityById<EntityC>(_context, anotherId);
break;
}
if (result == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);