Ste*_*ath 9 constructor controller t4mvc
我正在使用T4MVC和MVC2.
我有以下构建基块:
一个简单的实体接口,定义每个POCO实体必须具有long Id属性:
public interface IEntity
{
public long Id;
}
Run Code Online (Sandbox Code Playgroud)一个简单的POCO类,它实现了IEntity接口并具有一些字符串属性:
public class CD : IEntity
{
public long Id { get; set; }
public long Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)基础控制器:
public abstract class EntityController<T> : Controller where T : class, global::IEntity
{
public EntityController(IEntityManager<T> manager);
}
Run Code Online (Sandbox Code Playgroud)我在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个参数的构造函数
我怎么解决这个问题?
我希望控制器基类是抽象的,它的构造函数受保护和参数化.通过向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生成可编译的代码.错误似乎总是试图为控制器类生成一个空(无参数)构造函数.
希望这有助于某人.
我看到了这个问题,它归结为 T4MVC 在处理泛型类时没有做正确的事情。通常它会在分部类中为其生成一个默认构造函数,但事实上它是通用的,因此无法实现。
您应该能够通过自己添加默认 ctor 来解决此问题,例如
public abstract partial class EntityController<T> : Controller where T : class, IEntity {
public EntityController() { }
// etc...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1717 次 |
| 最近记录: |