我正在尝试编写一个异常处理程序类,它将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:
代表可以这样做吗? 还有另一种方法可以解决这个问题吗?
答案 0 :(得分:1)
IT部门认为您拥有不同类型的密钥:用户拥有一个int密钥,而Groups拥有一个字符串密钥。所以我制作了一个通用界面,其方法没有类型参数,如下所示:
interface IRepository<TItem, TKey>
{
void RemoveItem(TItem item);
void RemoveByKey(TKey key);
void RemoveByName(string name);
}
应该明确实施,但如果它没有发表评论。
编辑:您也可以这样做,但只有TKey和TItem永远不会相同,并且永远不会string
:
interface IRepository<TItem, TKey>
{
void Remove(TItem item);
void Remove(TKey key);
void Remove(string name);
}
答案 1 :(得分:0)
您可以将通用参数T
移动到界面本身:
public interface IHandleCrudOperations<TKey, T>
{
void Remove(TKey item);
void Add(T item);
void Edit(T item);
void Clone(T item);
}
public class UserRepository : IHandleCrudOperations<int, User>
{
public void Remove(int userKey)
{
_context.Users.FirstOrDefault(x => x.UserKey == userKey);
//stuff
}
public void Add(User user)
{
}
}