【发布时间】:2014-08-20 04:05:30
【问题描述】:
我正在尝试编写一个异常处理程序类,它将 EF 异常类型转换为 HttpStatusCodes。 我知道如何处理捕获并将消息发送到 ApiController。
public class ExceptionConverter : IExceptionConverter
{
//need the parameter
public HttpStatusCode Convert()
{
try
{
//call the void repository method here
}
catch (Exception exception)
{
if (exception is ObjectNotFoundException)
return HttpStatusCode.NotFound;
if (exception is InvalidOperationException)
return HttpStatusCode.BadRequest;
}
return HttpStatusCode.OK;
}
}
我想知道是否有办法编写可以调用我的 void 存储库方法的 Delagate 或 Generic 方法。
我在想我可以将接口与我在转换中使用的方法一起使用
public interface IHandleCrudOperations
{
//All of these methods need to be able to take in many different parameters
//They will always need a parameter though
void Remove();
void Add();
void Edit();
void Clone();
}
如您所见,我需要能够根据相关存储库方法传入大量不同的参数:
//userRepository
public void Remove(int userKey)
{
//stuff
}
//groupRepository
public void Remove(string groupName)
{
//stuff
}
//someOtherRepository
public void Remove(RemoveSomethingRequest request)
{
//stuff
}
我考虑过为此使用通用方法:
public interface IHandleCrudOperations
{
//All of these methods need to be able to take in many different parameters
//They will always need a parameter though
void Remove<T>(T item);
void Add<T>(T item);
void Edit<T>(T item);
void Clone<T>(T item);
}
现在实施变得困难:
//userRepository
public void Remove<T>(T item)
{
//SERIOUS code smell here
var userKey = (int)(object)item
_context.Users.FirstOrDefault(x => x.UserKey == userKey);
//stuff
}
//groupRepository
public void Remove<T>(T item)
{
//SERIOUS code smell here
var groupName = (string)(object)item
//stuff
}
//someOtherRepository
public void Remove<T>(T item)
{
//SERIOUS code smell here
var request = (RemoveSomethingRequest)(object)item
//stuff
}
这有很多不好的缺陷,可读性,滥用泛型,通常只是不好等等......
因此,由于该操作的所有方法都返回 void:
委托可以做到这一点吗? 有没有其他方法可以解决这个问题?
【问题讨论】:
-
我怀疑代码异味可以通过从根本上重新考虑设计来消除。存储库是如何实现和使用的?
-
@phoog 每种类型(例如用户、组、报告等)都有一个特定于其类的存储库。我们如何处理 Crud 操作无法统一,因为我们有时需要通过 Kev、Name 或实际 User 对象添加/编辑/删除用户
-
检查我编辑的答案是否有其他想法。