9

我将 T4MVC 与 MVC2 一起使用。

我有以下构建块:

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

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

    public class CD : IEntity
    {
        public long Id { get; set; }
    
        public long Name { get; set; }
    }
    
  3. 基础控制器:

    public abstract class EntityController<T> : Controller where T : class, global::IEntity
    {
        public EntityController(IEntityManager<T> manager);
    }
    
  4. 我在我的CDControllerCDManager实现IEntityManager接口,这是一个 UnitOfWork 模式以添加 CRUD 功能)中使用这个基本控制器:

    public partial class CDController : EntityController<CD>
    {
        public CDController() : base(new CDManager()) { }
    }
    

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

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

但这在编译期间给了我一个错误:

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

我该如何解决这个问题?

4

3 回答 3

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;
    }
}

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

希望这可以帮助某人。

于 2012-06-27T14:21:05.097 回答
2

我看到了问题,归结为 T4MVC 在处理泛型类时没有做正确的事情。通常它会在部分类中为它生成一个默认的ctor,但它是通用的事实将它扔掉。

您应该能够简单地通过自己添加一个默认 ctor 来解决,例如

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

    // etc...
}
于 2011-07-19T05:59:00.460 回答
0

我注意到一些非常奇怪的事情:

我已将空构造函数添加到基类中,但没有它throw new NotImplementedException();并且它工作正常。

但奇怪的是,当调用控制器时,如果我有一个类似 /{controller}?params的 URL (在 RouteConfig 中将默认操作设置为 Index),则会调用基类上的无参数私有控制器。但是当我有一个像/{controller}/{action}?params这样的 url 时,就会调用带有参数的构造函数。

于 2015-11-13T09:09:27.320 回答