9

MVC2でT4MVCを使用しています。

次の構成要素があります。

  1. long Idすべての POCO エンティティにプロパティが必要であることを定義する単純なエンティティ インターフェイス:

    public interface IEntity
    {
        public long Id;
    }
    
  2. インターフェイスを実装し、IEntityいくつかの文字列プロパティを持つ単純な POCO クラス:

    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. 私はこの基本コントローラーを私の中で使用します( CRUD機能を追加するためのUnitOfWorkパターンであるインターフェースを実装するCDController場所):CDManagerIEntityManager

    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

コントローラーの基本クラスを抽象化し、コンストラクターで保護してパラメーター化したかったのです。NotImplementedException をスローする空のコンストラクターを ControllerBase に追加することで、この問題を回避しました。

気分は良くありませんが、仕事は完了します。唯一の問題は、依存性注入と組み合わせると、間違ったコンストラクターが呼び出されることです。例外がスローされるため、アプリが故障します。

コード:

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 に答える