0

排他的な技術的見地から、この質問を言い換えたいと思います。

通常、汎用ベース リポジトリ クラスには、Add、Delete、Update、GetById、および GetAll メソッドが含まれています。

今、私は EntityExists などのように、この基本クラス内により多くのメソッドを入れたいと思っています... IQueryable.GetAll() メソッドをドリルダウンする必要があるより具体的なものが必要な場合は、述語を作成/ GetAll メソッドに添付するだけです. これにより、技術的な側面だけから見た多くのクラスとインターフェースを節約できます。

しかし、このアプローチに従うと、プログラムにどのような悪影響が及ぶでしょうか?

4

3 に答える 3

0

基本クラスは、スイスアーミーナイフやユーティリティクラスではありません。SOLIDの原則はそれらにも適用されます。

リポジトリに関しては、2つの方法があります。1つ目は、すべてのエンティティに同じリポジトリクラスを使用する仕様パターンを使用することです。代わりに行うことは、クエリ時に組み合わせたり、個別に使用したりできる小さな仕様クラスを作成することです。例:

repository.Query(new FindLockedUsers(new Paging(1, 50)); 

ここでFindLockedUsers、とPagingは2つの仕様です(内部クラスはAND:edです)。実装は一種のデコレータパターンです。

別の方法は、エンティティごとに特定のリポジトリを使用することです(ルートアグリゲート)。これらのgetメソッドは、次のようにエンティティごとにカスタマイズされます。

repository.FindLockedUsers(int pageNumber, int pageSize);

個人的には後者の方が好きです。なぜなら、コントラクトに従うのがはるかに簡単になるからです(つまり、リポジトリのインターフェース/クラスを読むだけで、その使用方法を理解できます)。

于 2013-02-26T06:44:31.600 に答える
0

汎用ベース リポジトリ クラスは、それを拡張する可能性のあるすべてのリポジトリに対して意味のあるメソッドのみを実装する必要があります。SOLID の原則に違反しないようなメソッドの例があれば、この基本クラスに自由に追加してください。

より具体的な例 (コード) がなければ、それ以上のガイダンスを提供できるとは思いません。

于 2013-02-23T22:19:03.703 に答える
0

OOP の原則に従っている場合は、必要に応じて実行できると思います。通常、EfDb クラスの実装に必要なものをすべて宣言するインターフェイスがあります。そうすれば、コントローラーはインターフェイスとのみ通信し、EfBd クラスに直接アクセスすることはできません。以下の例を参照してください。

インターフェース

public interface IDataSource
{
    //Person Entities
    IQueryable<Person> Persons{ get; }
    void SavePerson(Person person);        
}

EfDb クラス

    //Person
    public DbSet<Person> Persons { get; set; }
    IQueryable<Person> IDataSource.Persons
    {
        get { return Persons; }
    }


    public void SavePerson(Person person)
    {
        using (var context = new EFootballDb())
        {
            if (person.PersonId == 0)
            {
                context.Persons.Add(player);
            }
            else if (person.PersonId > 0)
            {
                 var currentPerson = context.Persons
                    .Single(p => p.PersonId == person.PersonId);

                context.Entry(currentPerson ).CurrentValues.SetValues(person);                    
            }
            context.SaveChanges();
        }
    }

次に、コントローラーで、このようにインターフェイスを呼び出すだけで、おそらく以下のように作成アクションを実装します。

 public class PersonController : Controller
 {

    private readonly IDataSource _dataSource;

    public PersonController(IDataSource dataSource)
    {
        _dataSource = dataSource;
    }

    [HttpGet]
    public ActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Create(Person model)
    {
       try
        {
            if (ModelState.IsValid)
            {                
                _dataSource.SavePerson(model);
                return RedirectToAction("Index", "Home");
            }
        }
        catch (Exception)
        {
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
        }
        return View(model);
    }

長いデモンストレーションで申し訳ありませんが、オブジェクト指向プログラミング (OOP) などの特定のソフトウェア設計原則に従っている限り、すべて問題ありません。すべては、実装を他のクラスからいかにうまく隠すかにかかっています。私のデモのように、コントローラ クラスは私の EfDb クラスにアクセスできません。

于 2013-02-26T07:16:06.670 に答える