根据一种方法中的参数访问不同的数据源

时间:2014-10-23 12:26:52

标签: c# refactoring

我对如何解决/实施此类问题有疑问:

案例: 根据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,它应该被分开。

任何帮助表示赞赏。感谢。

1 个答案:

答案 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);