4

次のように定義されたクラスがあります。

public abstract class Repository<TEntity, TDataContext> : DisposableBaseClass
   where TEntity : class
   where TDataContext : DataContext, new()
{...contains Linq to SQL related functionality

具体的なサブクラスでは、タイプをそのように定義します。

public class ConcreteRepo : Repository<LSTableClass, LSDataContext>

次の層には、リポジトリオブジェクトをプライベート変数として保持するビジネスオブジェクトがあります。

これは問題ありませんでした。

private ConcreteRepo _repository;

ただし、これをすべてのビジネスオブジェクトの親クラスにリファクタリングしました。この親クラスはリポジトリを保持し、リポジトリなどを破棄するためのDisposeパターンを実装します。

私の問題は、変数の宣言に適切な構文を取得できないことです。

私が来た最も近いものは;

protected Repository<Object, DataContext> _repository;

しかし、これはコンパイルエラーを引き起こします:

「エラー1'System.Data.Linq.DataContext'は、ジェネリック型またはメソッド'....リポジトリ'..のパラメータ'TDataContext'として使用するために、パブリックパラメータなしコンストラクタを備えた非抽象型である必要があります。 「」

私は他のさまざまなことを試しましたが、他の問題にぶつかりました。

この抽象クラスを継承するビジネスレイヤーオブジェクトでは、キャストで_repository変数を作成して使用しています。

(Repository<LSTableClass, LSDataContext>)_repository = new ConcreteRepo();
  • 親でこの宣言を正しく取得できると仮定すると、これで問題ないと思います。

これを機能させることができない場合は、各ビジネスオブジェクトで完全/具象型の詳細を使用して_repositoryを宣言し、それぞれにdisposeパターンを実装してクリアする必要があります。世界の終わりではありませんが、私はそうする必要はありません。

4

2 に答える 2