1

カスタムモデルバインダーにデータアクセスを適切に実装するにはどうすればよいですか?

コントローラの場合と同様に、IContentRepositoryを使用して、コンストラクタで実装クラスのインスタンスを作成します。したがって、後の段階でIoC(DI)を組み込む準備ができています。

今、私はモデルバインダーに似たものが必要です。バインダーでDBルックアップを行う必要があります。私はコントローラーで行うのと同じ方法でそれを行うことを考えていますが、私は提案を受け入れています。

これは私のコントローラーの1つからのスニペットであるため、コントローラーでどのように実行しているかを想像できます。

        public class WidgetZoneController : BaseController
        {
// BaseController has IContentRepository ContentRepository field
            public WidgetZoneController() : this(new XmlWidgetZoneRepository())
            {
            }

            public WidgetZoneController(IContentRepository repository)
            {
                ContentRepository = repository;
            }
    ...
4

2 に答える 2

0

バインダーは通常エンティティをバインドするため、のような特定のリポジトリは必要ありませんIContentRepository。実際IRepository<T>、エンティティを取得するのに適しています。

IRipositoryをインスタンス化するには、次のようなものを使用できます。

var repositoryType = typeof (IRepository<>).MakeGenericType(entityType);

ここで、エンティティバインダーのCodeCampServer実装を確認することをお勧めします。

http://code.google.com/p/codecampserver/source/browse/trunk#trunk/src/UI/Binders/Entities

于 2010-04-11T20:12:16.430 に答える
0

カスタムモデルバインダークラスへのコンストラクターインジェクションを使用でき、DefaultModelBinderから継承することもできます。

public class MyModelBinder : DefaultModelBinder
{
    IContentRepository ContentRepository;

    public MyModelBinder(IContentRepository contentRepository)
    {
        this.ContentRepository = contentRepository;
    }

カスタムモデルバインダーを使用して、次のようにApplication_Start()に登録します。

protected void Application_Start()
{
    System.Web.Mvc.ModelBinders.Binders.Add(
           typeof(MyModel), new MyModelBinder(contentRepository)
    );

IoCを使用するときは、オブジェクトの存続期間を覚えておく必要があります。コントローラでIoCを使用する場合、コントローラはWebリクエストごとに存在します。したがって、リポジトリを挿入すると、データ接続またはOR/Mセッションはその短時間だけ存在します。

モデルバインダーを使用すると、基本的には長寿命のシングルトン(Application_Start())になります。したがって、両方の場合でリポジトリが機能することを確認してください。

于 2011-04-20T03:40:27.527 に答える