2

C# でインターフェイスを適切に管理する方法がわかりません。私の目標は、さまざまな DAL リポジトリ メソッドを呼び出すいくつかの一般的なメソッド (Save()、Dispose() など) を持つビジネス レイヤー サービスの抽象クラスを作成することです。すべてのサービスで次のようなことを繰り返さないようにしたい:

public Save() 
{
   repository.Save();
}

私はそれに似たシナリオを持っています:

インターフェース

namespace Common
{
    public interface IRepository
    {
        void Save;
        void Dispose;
    }
}

ダル

namespace DAL
{
    public Repository : IRepository
    {
        public void Save() {};
        public void Dispose() {};
        public void Add() {}
    }
}

BL

namespace BL
{
    public abstrac BaseService
    {
        protected IRepository repository;
        protected BaseService(IRepository repo)
        {
            repository = repo;
        }

        public Save() 
        {
            repository.Save();
        }
    }

    //...

    //Tentative 1
    public Service : BaseService
    {
        private Repository rep;

        public Service()
            : base(new DAL.Repository())
        {
            rep = base.repository; // ERROR: cannot convert IRepository to Repository
        }
    }
}

私もこれを試しました:

//Tentative 2
public Service : BaseService
{
    private IRepository rep;

    public Service()
        : base(new DAL.Repository())
    {
        rep = base.repository; // OK
    }

    public void Add()
    {
        rep.Add() // ERROR: IRepository doesn't contain a definition for 'Add'
    }
}

使用したいすべてのメソッドをインターフェイスで定義できることはわかっていますが、ジェネリック型に関する多くの問題を管理する必要があります。私の質問から理解できるはずですが、私は C# の初心者であり、少なくとも私がより専門的になるまでは、複雑さを避けたいと思います:)

4

3 に答える 3

3

まず、メンバーと名前が衝突していると思います IRepository rep.

使ってみて DAL.IRepository rep

エラーが発生する理由は、「追加」を「リポジトリ」に固有のものとして定義したためです。メンバー変数は「IRepository」であり、「IRepository」を実装するものなら何でも入れることができます。

リポジトリを配置できるからといって、その上のすべてがリポジトリになるわけではありません。(すべての指が指であるとは限りませんが、すべての指が親指であるとは限りません)

任意のリポジトリで add を呼び出す必要がある場合は、それをインターフェイスに追加します。それ以外の場合は、そのメンバーを IRepository にするか、Repository にするかを決定する必要があります。

または、使用できます

    Repository myRep = rep as Repository;
    if(rep!=null)
    {
       myRep.Add();
       ...
       profit();
    }
于 2013-01-31T10:18:43.533 に答える
1
public Service()
        : base(new DAL.Repository())
    {
           rep = (Repository)base.repository;

    }

このようにして、IRepositoryの一部ではなく、拡張クラスの新しい実装であるAdd()サービスを取得します。

于 2013-01-31T10:15:00.193 に答える
0

あなたの主な問題はAddメソッドへのアクセシビリティの欠如であり、とにかくこれは比較的一般的なメソッドであるため、最初にあなたの に追加することをお勧めしますIRepository。したがって、次のようになります。

public interface IRepository
{
    void Add();
    void Save();
    void Dispose();
}

から継承しながら、適切なリポジトリを実装しますIRepository。当然のことながら、 のカスタム メソッドにアクセスできるようにしたい場合がありますRepository。これを解決するためにできることはBaseService、汎用リポジトリを受け入れることです。

public BaseService<T> where T : IRepository
{
    protected T repository { get; set; }
    protected BaseService(T repo)
    {
        repository = repo;
    }
}

次に、サービスは次のようになります

public UserService : BaseService<UserRepository>
{
    public UserService() : base(new DAL.UserRepository())
    {
        // base.Repository is now a UserRepository.
    }    
}

この実装では、ジェネリックで厳密に型指定されているため、公開されてUserServiceいるすべてのメソッドにアクセスできます。UserRepositoryお役に立てれば。

于 2013-01-31T10:27:17.733 に答える