t4mvc:无法继承没有默认构造函数的控制器类?

Ste*_*ath 9 constructor controller t4mvc

我正在使用T4MVC和MVC2.

我有以下构建基块:

  1. 一个简单的实体接口,定义每个POCO实体必须具有long Id属性:

    public interface IEntity
    {
        public long Id;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 一个简单的POCO类,它实现了IEntity接口并具有一些字符串属性:

    public class CD : IEntity
    {
        public long Id { get; set; }
    
        public long Name { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 基础控制器:

    public abstract class EntityController<T> : Controller where T : class, global::IEntity
    {
        public EntityController(IEntityManager<T> manager);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我在my中使用这个基本控制器CDController(其中CDManager实现了IEntityManager接口,这是一个UnitOfWork模式来添加CRUD功能):

    public partial class CDController : EntityController<CD>
    {
        public CDController() : base(new CDManager()) { }
    }
    
    Run Code Online (Sandbox Code Playgroud)

当我运行我的t4模板时,会生成以下代码:

namespace MyApp.Web.Controllers {
    public partial class CDController {
        [GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
        protected CDController(Dummy d) { }
Run Code Online (Sandbox Code Playgroud)

但这在编译过程中给出了一个错误:

MyApp.EntityController <CD>不包含带0个参数的构造函数

我怎么解决这个问题?

Ale*_*ina 7

我希望控制器基类是抽象的,它的构造函数受保护和参数化.通过向ControllerBase添加一个空的构造函数来解决此问题,该构造函数抛出NotImplementedException.

感觉不对,但它完成了工作.唯一的问题是当与依赖注入相结合时,将调用错误的构造函数 - 因为它抛出异常,应用程序将会失效.

码:

public abstract class ControllerBase : Controller
{
    protected object AlwaysSupply { get; private set; }

    public ControllerBase()
    {
        throw new NotImplementedException();
    }

    public ControllerBase(object alwaysSupply)
    {
        AlwaysSupply = alwaysSupply;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将导致T4MVC生成可编译的代码.错误似乎总是试图为控制器类生成一个空(无参数)构造函数.

希望这有助于某人.


Dav*_*bbo 2

我看到了这个问题,它归结为 T4MVC 在处理泛型类时没有做正确的事情。通常它会在分部类中为其生成一个默认构造函数,但事实上它是通用的,因此无法实现。

您应该能够通过自己添加默认 ctor 来解决此问题,例如

public abstract partial class EntityController<T> : Controller where T : class, IEntity {
    public EntityController() { }

    // etc...
}
Run Code Online (Sandbox Code Playgroud)