0

リポジトリを以下のように設定しています。

interface IRepository<T> where T : DataRow
{
  T Get(int key);
}

interface ICartonRepository : IRepository<CartonDataRow>
{

}

class CartonRepository : ICartonRepository
{
  public CartonDataRow Get(int key)
  {

  }
}

CartonRepositoryと同じ方法で定義されたPackRepositoryもあります。私がやりたいのは次のようなものです。

IRepository<DataRow> repository;
switch (rowType)
{
  case Carton:
    repository = new CartonRepository();
    break;
  case Pack:
    repository = new PackRepository();
    break;
}

これを達成する方法はありますか?

4

3 に答える 3

0
interface IRepository<out T> where T : DataRow
{
  T Get(int key);
}

ただし、これには C# 4.0 が必要です。

于 2012-05-11T03:09:41.543 に答える
0

ある種のFactory patternが必要です。

次のロジックは Factory クラスに移動する必要があります

class RepositoryFactory
{
    IRepository<T>  Get(rowType)
    {
        IRepository<T> repository = default(IRepository<T>);
        switch (rowType)
        {
        case Carton:
            repository = new CartonRepository();
            break;
        case Pack:
            repository = new PackRepository();
            break;
        }

        return repository;
    }
}

依存性注入を使用するか、すべてのリポジトリをディクショナリに維持することに基づいて、Get メソッドをさらに改善できます。

于 2012-05-11T03:21:04.727 に答える
0

C# 3.5 の場合、以下を追加する必要があります。

public interface IRepository {
   DataRow Get(int key);
}

public abstract class Repository<T> : IRepository<T>, IRepository
    where T : DataRow
{
   public abstract T Get(int key);

   DataRow IRepository.Get(int key) {
       return this.Get(key);
   }
}

次に、に変更CartonRepositoryclass CartonRepository : Repository<CartonDataRow>ます ( は必要ないと思いますが、必要ICartonRepositoryに応じて使用できます)。それで

IRepository repository;
switch (rowType)
{
  case Carton:
    repository = new CartonRepository();
    break;
  case Pack:
    repository = new PackRepository();
    break;
}
于 2012-05-11T03:23:51.520 に答える