具有泛型的基本API控制器

时间:2014-12-30 17:13:50

标签: c# generics asp.net-web-api2

我正在尝试为我的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仍被称为请求中的第一件事。

1 个答案:

答案 0 :(得分:0)

发表评论作为答案。

问题是new()对于泛型类中使用的类型只是constraint。它将要求此类型应具有默认构造函数。如果type没有,那么它将产生编译错误。

所以你只需要在代码中手动调用构造函数,因为代码知道该类型具有默认构造函数并且将被执行。