我正在尝试为我的Web API 2控制器实现一个简单的Base类 - 它们应该总是有一个Entity Framework repo和一个Dispose
方法 -
public abstract class BaseController<TRepo> : ApiController where TRepo : Repository<EF.DBContext>, new()
{
private readonly TRepo _repo;
protected TRepo Repo { get { return _repo; } }
protected override void Dispose(bool disposing)
{
_repo.Dispose();
base.Dispose(disposing);
}
}
继承控制器 -
public class EntriesController : BaseController<EntryRepo>
{
[HttpGet]
public IEnumerable<Domain.Transaction.Entry> Get()
{
return (Mapper.Map<IEnumerable<Domain.Transaction.Entry>>(Repo.GetAll()));
}
[HttpPost]
[SendSignalRNotification]
public Domain.Transaction.Entry Save(Domain.Transaction.Entry newEntry)
{
return (Mapper.Map<Domain.Transaction.Entry>(Repo.Insert(Mapper.Map<EF.Transaction.Entry>(newEntry))));
}
}
我有两个问题:
1. dispose
的{{1}}在孩子的行动之前被召唤
2. BaseController
总是_repo
,我认为null
会使其实例化
我对仿制药很新,我显然也不了解某些东西。谢谢!
更新:
new()
Per Sergey的评论我已经为public abstract class BaseController<TRepo> : ApiController where TRepo : Repository<EF.DBContext>, new()
{
private readonly TRepo _repo;
protected TRepo Repo { get { return _repo; } }
protected BaseController()
{
_repo = new TRepo();
}
protected override void Dispose(bool disposing)
{
_repo.Dispose();
base.Dispose(disposing);
}
}
添加了一个构造函数,BaseController
不再为null,数据又回来了。
然而,由于某种原因,_repo
仍被称为请求中的第一件事。
答案 0 :(得分:0)
发表评论作为答案。
问题是new()
对于泛型类中使用的类型只是constraint。它将要求此类型应具有默认构造函数。如果type没有,那么它将产生编译错误。
所以你只需要在代码中手动调用构造函数,因为代码知道该类型具有默认构造函数并且将被执行。