1

ASP.NET MVC 4 アプリケーションの学習では、リポジトリ パターンとサービス レイヤーを使用します。プロジェクトではエンティティ フレームワークと Autofac が使用されます。私のデータ クラスは単純で、ほとんどすべての操作は基本的な CRUD 操作です。

次のような抽象的なリポジトリベースがあります。

public abstract class RepositoryBase<T> where T : class

これは、Sample1 エンティティのサンプル リポジトリです。

   public class Sample1Repository : RepositoryBase<Sample1>, ISample1Repository
   {
        public Sample1Repository(IDatabaseFactory databaseFactory)
            : base(databaseFactory)
        {
        }
    }

   public interface ISample1Repository : IRepository<Sample1>
   {
   }

これは私のコントローラーです:

public class SampleController : Controller
{
    private readonly ISampleService _sampleService;

    public SampleController(ISampleService sampleService)
    {
        this._sampleService = sampleService;
    }
}

最後に、これが私のサービスです。

public interface ISampleService
{
    IEnumerable<Sample1> GetSample1s();
    Sample1 GetSample1(int id);
    void CreateSample1(Sample1 item);
    void DeleteSample1(int id);
    void SaveSample1();
}

public class SampleService : ISampleService
{
    private readonly ISample1Repository _sample1Repository;

    private readonly IUnitOfWork _unitOfWork;

    public SampleService(ISample1Repository sample1Repository, IUnitOfWork unitOfWork)
    {
        this._sample1Repository = sample1Repository;
        this._unitOfWork = unitOfWork;
    }
}

今、私はこれらの質問があります:

1) エンティティ リポジトリごとに個別のクラスを作成する必要がありますか。(つまり、エンティティ Sample2 の別の Sample2Repository)

2) これらの CRUD タスクを実行するために汎用サービスを使用できますか?

3) 一般的なサービスが可能な場合。Autofacブートストラップに登録するにはどうすればよいですか?

4

1 に答える 1

4

1) エンティティ リポジトリごとに個別のクラスを作成する必要がありますか。

可能であれば、単一のジェネリックIRepository<T>実装を作成し、それをこのオープン ジェネリック インターフェイスにマップします。

2) これらの CRUD タスクを実行するために汎用サービスを使用できますか?

もちろんできますが、本当の問題は次のとおりです。そうすると便利ですか? ISampleServiceのロジックを単純に複製しているように思えますIRepository<T>。おそらくこのリポジトリに転送されます。私には役に立たない抽象化のように思えます。アプリケーションが真の CRUD である場合は、リポジトリをコントローラに直接注入できます。

3) 一般的なサービスが可能な場合。Autofacブートストラップに登録するにはどうすればよいですか?

次のように、オープン ジェネリック インターフェイスをオープン ジェネリック実装にマップできます。

builder.RegisterGeneric(typeof(EntityFrameworkRepository<>))
    .As(typeof(IRepository<>))

多くの具象 (非ジェネリック)IRepository<T>実装があり、それらを一括登録したい場合は、次のように行うことができます。

builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
    .AsClosedTypesOf(typeof(IRepository<>));
于 2013-02-28T16:18:56.893 に答える