3

リポジトリ パターンを使用したい (Unit of Work パターンを使用できることはわかっていますが、ここではリポジトリ パターンを使用したいと思います)。したがって、各リポジトリ クラスには、特定のテーブルに対するクエリがあります。次に例を示します。

public class NotesRepository : INotesRepository, IDisposable
{
    private DatabaseContext context;

    public NotesRepository(DatabaseContext context)
    {
        this.context = context;
    }

    public IQueryable<Notes> GetAllNotes()
    {
        return (from x in context.Notes
                select x);
    }
}

そして別のリポジトリの例:

public class CommentsRepository : ICommentsRepository, IDisposable
{
    private DatabaseContext context;

    public CommentsRepository(DatabaseContext context)
    {
        this.context = context;
    }

    public IQueryable<Comments> GetAllComments()
    {
        return (from x in context.Comments
                select x);
    }
}

ここで、これら 2 つのリポジトリを 1 つのコントローラーで使用したいと思います。リポジトリ パターンでは、コントローラ コンストラクタでデータベース接続を初期化し、それを各リポジトリに渡します。よろしいですか? 例えば:

public class HomeController : Controller
{
    private INotesRepository NotesRepository;
    private ICommentsRepository CommentsRepository;

    public HomeController()
    {
        DatabaseContext db = new DatabaseContext();

        this.NotesRepository = new NotesRepository(db);
        this.CommentsRepository = new CommentsRepository(db);
    }

    // ........
}
4

3 に答える 3

1

コントローラーにリポジトリーをコンストラクターの依存関係として持たせることで、これを少なくとも一歩進める必要があると思います。ControllerFactoryこれは、カスタム(ASP.NET MVC および MVC2 で使用) または DependencyResolver (ASP.NET MVC3 IIRC で導入。IoC コンテナーに移行する場合に適しています)で Controller および Repository インスタンスを作成することを意味します。DatabaseContext は通常HttpRequest、リクエスト中に同じ UnitOfWork を維持するために、Web アプリケーションごとに作成されます。IoC コンテナーを使用している場合、これは簡単に実行できます。これは、これに対するサポートがすべての主要なコンテナーに組み込まれているためです。手動で行う場合はDatabaseContextApplication.BeginRequestおよびEndRequestイベントで を作成および破棄するためのいくつかのメカニズムを接続する必要があります。

DatabaseContext簡単にするために、コンテナを使用せず、.NETごとに 1 つのインスタンスを持つ ASP.NET MVC の例を示しますController。また、コントローラーが「解放」されると、DatabaseContext は破棄されません。

public class HomeController : Controller
{
    private INotesRepository notesRepository;
    private ICommentsRepository commentsRepository;

    public HomeController(INotesRepository notesRepostory, 
        ICommentsRepository commentsRepository)
    {
        this.notesRepository = notesRepository;
        this.commentsRepository = commentsRepository;
    }
}

public class MyControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(
        RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            return base.GetControllerInstance(requestContext, controllerType);

        DatabaseContext db = new DatabaseContext();
        //Here you should have logic to determine which 
        //type of controller to create
        return new HomeController(new NotesRepository(db), 
            new CommentsRepository(db));
    }
}

Global.asax Application.Start イベント ハンドラーで:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

コンテナー ルートを使用する場合、MVC とお気に入りのブランドのコンテナーを使用した IoC の例はたくさんあります。

制御の反転を使用する利点は、アプリケーションが疎結合になり、変更と保守が容易になることです。

于 2012-12-08T16:10:20.390 に答える
0

リポジトリを使用する場合、ビジネス ロジックからデータ アクセス コードを抽象化する必要があるため、コントローラー内の接続を処理するのはあまりクリーンではありません。ここで必要なのはリポジトリではないかもしれません...

于 2012-12-08T14:08:10.673 に答える
-1

このケースは、依存性注入を使用するのに非常に適しています (はとDatabaseContextの両方の依存関係です)。NotesRepositoryCommentsRepository

これは、 Ninjectのような依存性注入コンテナーによって簡単に解決されます。

于 2012-12-08T14:04:37.127 に答える