リポジトリパターンは素晴らしいリポジトリパターンに慣れる


リポジトリパターンはコンピューターサイエンスの大部分のように別の抽象化です.それは多くの異なる言語で適用できるパターンです.実際、多くの開発者はリポジトリパターンを使用し、それを実現しない.
この投稿ではコードを変換します.データベースから1つのレコードを読み込み中のコードから始めます.レコードが取得されると、呼び出し元に返されます.いくつかのコードを見てみましょう.

ニーズ改善
我々のデータベースの読み込み中のレコードはPersonModel .
public class PersonModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}
データベースから人をロードするサービスはICompanyLogic . それは以下のメソッド定義から成ります.
public interface ICompanyLogic
{
    PersonModel GetPersonByName(string name);
}
の実装ICompanyLogicCompanyLogic .
public class CompanyLogic: ICompanyLogic
{
    private IPersonDataContext _personDataContext;
    public PersonService(IPersonDataContext personDataContext)
    {
        _personDataContext= personDataContext;
    }

    public PersonModel GetPersonByName(string name)
    {
        using(var ctx = _personDataContext.NewContext())
        {
            var person = ctx.People.First(p => p.Name.Equals(name));
            return person;
        }
    }
}
これまでのところ、これはそんなに悪くない.ビジネスサービスがあるCompanyLogic これは、データベースから単一の人を取得することができます.
しかし、我々はまた、別のデータベースから会社をロードする方法を必要とする新しい要件を持っています.それで、我々は新しいメソッドを加えて、延長する必要がありますCompanyLogic .CompanyModel companyデータベースに格納されているモデルを表します.
public class CompanyModel
{
    public string Name { get; set; }
    public int Size { get; set; }
    public bool Public { get; set; }
}
拡張するCompanyLogic 名前で会社を返すメソッドを持つこと.
public class CompanyLogic: ICompanyLogic
{
    private IPersonDataContext _personDataContext;
    private ICompanyDataContext _companyDataContext;
    public PersonService(IPersonDataContext personDataContext, 
                         ICompanyDataContext companyDataContext)
    {
        _personDataContext= personDataContext;
        _companyDataContext = companyDataContext;
    }

    public PersonModel GetPersonByName(string name)
    {
        using(var ctx = _personDataContext.NewContext())
        {
            var person = ctx.People.First(p => p.Name.Equals(name));
            return person;
        }
    }

    public CompanyModel GetCompanyByName(string companyName)
    {
        using(var ctx = _companyDataContext.NewContext())
        {
            var person = ctx.Company.First(c => c.Name.Equals(companyName));
            return person;
        }
    }
}
今、私たちは、この初期の解決に関する問題を見始めています.ここでは理想的ではないものの短いリストです.
  • CompanyLogic , つの異なるデータベースにアクセスする方法を知っている.
  • 我々は、我々のコードを複製しましたusing 文.
  • 我々のロジックは、人々と企業がどのように格納されるかを知っています.
  • GetPersonByName and GetCompanyByName すべてをもたらすことなく再利用できないCompanyLogic .
  • これらのすべてに加えて、どのようにテストするのですかCompanyLogic 現在の状態で?私たちは、人々と企業のためにデータ文脈を偽造しなければなりません.これは可能です.しかし、我々のハードワークは、我々の論理をテストすることになっていなければなりません.

    リポジトリパターンの実装
    リポジトリパターンは、データアクセスの上部に抽象レイヤを追加します.
    抽象化の少しは長い道のりを行く.リポジトリパターンを使用すると、人々と企業のデータベースにアクセスするための抽象化の薄い層を追加することができます.Then CompanyLogic またはその他のロジックは、これらの抽象化を活用することができます.
    我々の創造によって始めましょうIPersonRepository インタフェースとその実装
    public interface IPersonRepository
    {
        PersonModel GetPersonByName(string name);
    }
    
    public class PersonRepository: IPersonRepository
    {
        private IPersonDataContext _personDataContext;
        public PersonRepository(IPersonDataContext personDataContext)
        {
            _personDataContext= personDataContext;
        }
    
        public PersonModel GetPersonByName(string name)
        {
            using(var ctx = _personDataContext.NewContext())
            {
                return ctx.People.First(p => p.Name.Equals(name));
            }
        }
    }
    
    それから、我々は会社のために非常に類似した何かをすることができます.私たちはICompanyRepository インタフェースとその実装
    public interface ICompanyRepository
    {
        PersonModel GetCompanyByName(string name);
    }
    
    public class CompanyRepository: ICompanyRepository
    {
        private ICompanyDataContext _companyDataContext;
        public CompanyRepository(ICompanyDataContextcompanyDataContext)
        {
            _companyDataContext= personDataContext;
        }
    
        public CompanyModel GetCompanyByName(string name)
        {
            using(var ctx = _companyDataContext.NewContext())
            {
                return ctx.Company.First(p => p.Name.Equals(name));
            }
        }
    }
    
    現在、2つの別々のリポジトリがあります.PersonRepository 人データベースから名前で与えられた人を読み込む方法を知っています.CompanyRepository 会社のデータベースから会社名を読み込むことができます.さあ、リファクタCompanyLogic データコンテキストの代わりにこれらのリポジトリを活用するには.
    public class CompanyLogic: ICompanyLogic
    {
        private IPersonRepository _personRepo;
        private ICompanyRepository _companyRepo;
        public PersonService(IPersonRepository personRepo, 
                             ICompanyRepository companyRepo)
        {
            _personRepo= personRepo;
            _companyRepo= companyRepo;
        }
    
        public PersonModel GetPersonByName(string name)
        {
            return _personRepo.GetPersonByName(name);
        }
    
        public CompanyModel GetCompanyByName(string companyName)
        {
            return _companyRepo.GetCompanyByName(companyName);
        }
    }
    
    それを見て、論理層はもはやデータベースについて何も知りません.私たちは、人と会社がどのように積み込まれているかを抽象化しました.それで、我々は利益を得ましたか?
  • リポジトリインターフェイスは再利用可能です.彼らは、ものを変えることなく、他の論理層で使われることができました.
  • テストは非常に簡単です.我々は我々のロジックをテストすることに集中できるようにインターフェイスの応答を模擬.
  • 人々と企業のためのデータベースアクセスコードは1つの場所で集中管理されます.
  • 最適化は、リポジトリレベルで行うことができます.インタフェースは定義され、同意される.リポジトリに取り組んでいる開発者は、彼女がどのように合うかについて、データを保存することができます.
  • リポジトリのパターンは、私たちのデータの素晴らしい抽象化を提供します.これは様々な言語に適用できる.物語のモラルは、データアクセスが単一の責任インターフェースでなければならないということです.このインターフェイスは、追加のロジックを追加するビジネス層に注入することができます.

    アマゾンのWebサービスを学ぶ空腹?
    アマゾンのWebサービスを学ぶために空腹である多くの人々がいます.この事実に触発されて、私はそれを使用してAmazon Webサービスを学ぶことに焦点を当てコースを作成しました.静的なウェブサイトをホストして、確保して、届ける問題に集中します.あなたはS 3、APIゲートウェイ、Cloudfront、ラムダ、およびWAFのようなサービスを問題に解決策を構築することを学ぶ.
    AWS周辺の情報海がある.それは簡単に取得し、学習の進捗状況を作るのは簡単です.この問題を通じて、我々は情報をカットし、あなたの学習をスピードアップすることができます.この本とビデオコースの私の目標は、私があなたと学んだことを共有することです.
    面白いですか?着陸ページをチェックし、あなたのために働くパッケージを選択してください.here .