質問

私の私のASP.NET MVC願いしカップルの興味深い思いを語りました。

多くのサンプルかつ使用のリポジトリのパターンIRepository)この黄色い肌に黒い模様の錦鯉を習っていたMVC.

していこうと思いますしてください、私はじめ現在のデザインとワンダまでのかかるものと思われます。

現在、私はついての基本的な IUserRepository, を指定する方法など FindById(), SaveChanges(), など。

現在、つい負荷/クエリーのユーザテーブルのDBいう、以下の

    private IUserRepository Repository;

    public UserController()
        : this(new UserRepository())
    { }

    [RequiresAuthentication]
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit(string ReturnUrl, string FirstRun)
    {
        var user = Repository.FindById(User.Identity.Name);

        var viewModel = Mapper.Map<User, UserEditViewModel>(user);
        viewModel.FirstRun = FirstRun == "1" ? true : false;

        return View("Edit", viewModel);
    }

    [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken(Salt = "SaltAndPepper")]
    public ActionResult Edit(UserEditViewModel viewModel, string ReturnUrl)
    {
        //Map the ViewModel to the Model
        var user = Repository.FindById(User.Identity.Name);

        //Map changes to the user
        Mapper.Map<UserEditViewModel, User>(viewModel, user);

        //Save the DB changes
        Repository.SaveChanges();

        if (!string.IsNullOrEmpty(ReturnUrl))
            return Redirect(ReturnUrl);
        else
            return RedirectToAction("Index", "User");
    }

今もわかりませんかMVC作品についてをコントローラーユーザーがリンクを作成す(ないしは1コントローラを使用1コントローラーにお願いていませんで陽に起こります。

また、いい質問の利用に関する汎用のリポジトリインタフェース IRepository<T> こちらの とても、静的 RepositoryFactory のでしょう。基本的に1のインスタンスのリポジトリが保たれまで得られたこの工場

なので私の質問は次の人がいかにないアプリの作成は良好と考えられる。

につい個人repositorysに基づく各テーブル(IUserRepository)?
ているのに使用したリ IRepository<T>?
い利用静的リポジトリです。
この完全?

編集:んべんきょうお願いて:

が有する民間 IRepository 各コントローラ良いでしょうか。やばいいインスタンスを生成の新しい IRepository 毎回利用したいのですか?

恵みの編集:僕らの恵みにありの視点となるジャストさんである。

んりんどうのこうの人のように簡単にアプリケーションやいているのでしょうが良い方法がありました。

役に立ちましたか?

解決

一部も明らかな問題の一般的 IRepository<T>:

  • では、各エンティティのタイプのキーとしてそのようなほとんどの非自明なシステム。一部の団体利用に特別な技術を必要か、そして何らかの自然および/または複合鍵があります。設定によりどちらのモを支援できることで、ほかの商品はイも広く満天の星空を望めます。れが好きなので、いろいろなhackishコードの自動キーマッピングしました。

  • ということになり、リポジトリでのみの対応を正確に一体タイプとサポートするだけでなく、最も些細な事業です。がリポジトリ去などの簡単なCRUDラッパーで非常に少ないを使用。使ってみるべきではないだろうかだけ、顧客 IQueryable<T> または Table<T>.

  • では、この行いを正確に同じ業務の各団体をいう。実際にはこのは非常に遠くからである。確かに、 を取得する Order そのIDがありがたいリストを取得し Order オブジェクトは特定の顧客および内部の日付範囲から選びます。の概念を完全般 IRepository<T> ることがない、そんを行っていきたいと考えてい種類のクエリの異なる種類の機関となった。

全体のポイントのリポジトリのパターンを 抽象化 共有データへのアクセスパターンと思いプログラムに飽きをリポジトリのように"ということをこんにちはかんをüber-リポジトリを扱うことのできるあらゆるエンティティタイプ!" ることができることを除いて、リポジトリはかなり役に立たな80%がどのようにしようとしています。では、基底クラス/インタフェースでもこの能力の限りにおいしいだけのぐさやを確保将来の頭痛).


理想から始め、汎用のリポジトリとするとどうなるのかわかりません

public interface IRepository<TKey, TEntity>
{
    TEntity Get(TKey id);
    void Save(TEntity entity);
}

お届けするこ してい List または GetAll 機能ことになるので親に考えること"真実-友情-勝利-真実のデータ全体からのテーブルを一度もしています。この時に始める必要がありますい特定のリポジトリ:

public interface IOrderRepository : IRepository<int, Order>
{
    IEnumerable<Order> GetOrdersByCustomer(Guid customerID);
    IPager<Order> GetOrdersByDate(DateTime fromDate, DateTime toDate);
    IPager<Order> GetOrdersByProduct(int productID);
}

いすを取得します。このようにしたのが、"ジェネリック"リポジトリのためのさまに実際おりたったことはありが必要で、非常に単純な取得によるidの意味ものですが、一般的にいませんパス周辺は、確かなコントローラのクラスです。


現のためのコントローラやらなければいけないということはこの、なんだかなり否定され、その反省に基づいたすべての作業だったとのリポジトリ

コントローラーズ ることができるようにリポジトリから、外の世界.その理由を作成したこれらのリポジトリができますのでいくつかの種類の反転制御を実現します。究極の目標はこちらできるスワップしてリポジトリのためにも、例えば、ユニット試験、あるいはする場合には、その結果生じるスイッチからの商品を団体の枠組みである。

この原則は:

public class OrderController : Controller
{
    public OrderController(IOrderRepository orderRepository)
    {
        if (orderRepository == null)
            throw new ArgumentNullException("orderRepository");
        this.OrderRepository = orderRepository;
    }

    public ActionResult List(DateTime fromDate, DateTime toDate) { ... }
    // More actions

    public IOrderRepository OrderRepository { get; set; }
}

つまり、コントローラ ルなどをリポジトリ, なるべきです。合リポジトリ構築の思いでをカップリングおねがいします。そのASP.NET MVCサンプルコントローラparameterlessコンストラクタを生成するコンクリートリポジトリのサイトが必要でコンパイルや実行に強いることなくセットアップ依存性を注入の枠組み

が生産されている場合は、すぐにリポジトリの依存関係を通じてコンストラクタまたは公共の財産、そしてまい、時間をお持つリポジトリでのコントローラが密な結合へのデータベース。必要なものを書くことができる試験のようにします:

[TestMethod]
public void Can_add_order()
{
    OrderController controller = new OrderController();
    FakeOrderRepository fakeRepository = new FakeOrderRepository();
    controller.OrderRepository = fakeRepository; //<-- Important!
    controller.SubmitOrder(...);
    Assert.That(fakeRepository.ContainsOrder(...));
}

できない場合 OrderController は予約なら、世界最大のオンに加え、独自のリポジトリこの試験方法になることになっているのですデータにアクセスにおいて、さらにコントローラーは、メソッドを呼び出して、正しいリポジトリ法に基づく行動する。


こんディなされているということを、ここには捏/嘲笑う.がージの写真できることを決定商品になっていましたのHQLに設定によりどちらのモが、まだま3ヶ月のポートか、したいできるこのリポジトリです。したがって、例えば、アジアの枠組みのように Ninject, ございますのでご注意下さいなので、この設定を変更:

Bind<ICustomerRepository>().To<LinqToSqlCustomerRepository>();
Bind<IOrderRepository>().To<LinqToSqlOrderRepository>();
Bind<IProductRepository>().To<LinqToSqlProductRepository>();

Bind<ICustomerRepository>().To<LinqToSqlCustomerRepository>();
Bind<IOrderRepository>().To<NHibernateOrderRepository>();
Bind<IProductRepository>().To<NHibernateProductRepository>();

としています。かに依存する IOrderRepository を使用して設定によりどちらのモ版、または変更 一行 のコードに対して潜在的に何百人ものです。自分たちの商品や設定によりどちらのモバージョンによる移植以上の機能を一枚一枚にな破壊ものです。


うつすべてのためのシェイプを作ってみました:

  1. なに頼いただくために、javascriptを使用したリ IRepository<T> インタフェース。多くの機能をしたいからリポジトリ 特定の, ない 汎用.したい場合がありま IRepository<T> 上のレベルのクラスまたはインタフェースの階層、それがコントローラによるべきである 特定の リポジトリはありませんと変更コードの5つの異なる箇所を発見した場合のリポジトリが抜けて重要。

  2. コントローラーを受け入れるべきリポジトリから、外部ています。これは重要なステップの解消にカップリングの改善testability.

  3. 通常通りを少し入ったワイヤのコントローラを用い依存関係を注入の枠組み、多くることができるようにシームレスに統合されたASP.NET MVC.それともでき、その後は、少なくとも使用などの静的なサービスプロバイダですので一元化すべてのリポジトリに作成。(長期的に見つかりをただ学ぶだけではなく、利用DI枠).

他のヒント

の実行(Do)の人が各テーブル(IUserRepository)に基づいて個々のrepositorysがありますか?の 私はそれぞれの集計ではなく、各テーブルのためのリポジトリを持っている傾向がある。

の彼らは、一般的なIRepositoryを使用していますか?の 可能ならば、はい。

の彼らは、静的リポジトリ工場?を使用しています 私はIOCコンテナを介してリポジトリインスタンスの注入を好む

ここで私はそれを使用している方法です。私は私のリポジトリのすべてに共通するすべての操作のためのIRepositoryを使用しています。

public interface IRepository<T> where T : PersistentObject
{
    T GetById(object id);
    T[] GetAll();
    void Save(T entity);
}

と私はまた、動作のために各集計の専用ITRepositoryを使用しますこのリポジトリに異なっています。例えば、ユーザのために私はUserRepositoryに区別されるメソッドを追加するIUserRepositoryを使用します。

public interface IUserRepository : IRepository<User>
{
    User GetByUserName(string username);
}

実装は次のようになります。

public class UserRepository : RepositoryBase<User>, IUserRepository
{
    public User GetByUserName(string username)
    {
        ISession session = GetSession();
        IQuery query = session.CreateQuery("from User u where u.Username = :username");
        query.SetString("username", username);

        var matchingUser = query.UniqueResult<User>();

        return matchingUser;
    }
}


public class RepositoryBase<T> : IRepository<T> where T : PersistentObject
{
    public virtual T GetById(object id)
    {
        ISession session = GetSession();
        return session.Get<T>(id);
    }

    public virtual T[] GetAll()
    {
        ISession session = GetSession();
        ICriteria criteria = session.CreateCriteria(typeof (T));
        return criteria.List<T>().ToArray();
    }

    protected ISession GetSession()
    {
        return new SessionBuilder().GetSession();
    }

    public virtual void Save(T entity)
    {
        GetSession().SaveOrUpdate(entity);
    }
}

:UserControllerでよりも、のようになります。
public class UserController : ConventionController
{
    private readonly IUserRepository _repository;
    private readonly ISecurityContext _securityContext;
    private readonly IUserSession _userSession;

    public UserController(IUserRepository repository, ISecurityContext securityContext, IUserSession userSession)
    {
        _repository = repository;
        _securityContext = securityContext;
        _userSession = userSession;
    }
}
リポジトリがカスタムコントローラファクトリを使用して依存性注入パターンを使用してインスタンス化されるよりも

。私は依存性注入層としてのStructureMapするを使用しています。

データベース層がNHibernateはあります。 ISessionは、このセッションでは、データベースへのゲートウェイです。

私はあなたが CodeCampServer の構造に見ることをお勧めしています、あなたは多くのことを学ぶことができますそれから。

あなたが学ぶことができるという別のプロジェクトでは、あちこちには誰缶ヘルプミーです。これは、私はまだそれで十分掘るません。

につい個人repositorysに基づく各テーブル(IUserRepository)?

あり、これに選択肢が2の理由:

  • 私のダルに基づく Linq to Sql (私のDTOsインタフェースに基づくファイル体)
  • の行う業務 原子 を追加する原子操作、保存するもの等)

ているのに使用したリIRepository?

あり , 風にDDD法と値スキームで作成したIRepositoryEntity/IRepositoryValue、IRepositoryその他のもの。

い利用静的リポジトリです。

Yesとno:を使用している IOCのコンテナ 呼び出しを介してstaticクラスです。しかし---ということができますような工場です。

注意 :シンプルにデザインしてみましたこのアーキテクチャに自分と同僚の鉱山見つかりで素晴らしいですして現在は当社の会社全体の枠組みにこのモデルはあまりの若い会社)これはオーディオビジュアルしていた場合でも、思うの枠組みのような解放される主要な俳優たち。

ObjectDataSourceのCodePlexの上::<のhref = "http://www.codeplex.com あなたは素晴らしいを見つけることができるのそれを可能にするために書かれたジェネリックRepopsitory のライブラリは、ASPのWebフォームとして使用されます/ MultiTierLinqToSql」のrel = "nofollowをnoreferrer"> MultiTierLinqToSql の

私のコントローラのそれぞれは、それらがサポートする必要のあるアクションのためのプライベートリポジトリを持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top