私が作業しているコードでは、コードの一部が現在のソフトウェアセッションに依存する構造があります。ソフトウェアセッションには、合成によって依存性が注入される複数のヘルパーオブジェクトが含まれます。C#での合成インターフェイスの簡略化
1つの例では、データリポジトリへのアクセスを含むIRepositoryが注入されています。 IRepositoryには、IDbContextを介してデータベースに書き込むDatabaseContextが含まれています。
SoftwareSessionは、ゲートウェイとして機能するデータベースへのすべてのアクセスに使用される、唯一の注入インフラストラクチャです。つまり、WriteCarなどのオブジェクトをデータベースに書きたい場合は、3つのインタフェース、2つの関数を作成オブジェクトに委譲し、1つの関数を実装で実装する必要があります。以下のコード部分で明確になっています。 WriteCarシグネチャは、3つのインタフェース(IRepository、ISoftwareSession、IDbContext)、複合オブジェクト関連関数と実際の実装(IDbContext)を単に呼び出す実装されていない2箇所(Repository、SoftwareSession)で同じに定義されています
これは、私がリファクタリング、コードの移動、機能の追加、または機能シグネチャの変更をしたいとき、私は常に1つの機能に対して6つの場所を変更する必要があることを意味します。
これは、テスト容易性を向上させるための最良の環境を提供し、ソフトウェアセッションがリポジトリへのアクセスをラップし、リポジトリがデータコンテキストへのアクセスをラップするベストプラクティスに従っていると思います。 、または私は下のコードでいくつかの概念の誤解を持っていますか?
これを実装するための、構造的にメンテナンス可能な方法は何ですか?たぶん、新機能ごとに書かれたコードの量を減らすために、ラムダやデリゲートのいくつかの巧妙な方法を使用していますか?または、Visual Studio、Resharperなどを使用して、ある種のテンプレートメカニズムからこのコードを簡単に生成するためのライブラリ(オートマッパのようなDTOを簡略化する)やツールもあります。
コンセプトの混乱がある場合は、私にお知らせください。私の同僚の中には、似たような見解がある人もいます。その場合、他者の誤解を明確にするのに役立つかもしれません。一つには
public class SoftwareSession : ISoftwareSession
{
...
IRepository repository;
public void WriteCar(Car car){
repository.WriteCar(car);
}
...
}
public interface ISoftwareSession{
...
void WriteCar(Car car);
...
}
public class Repository : IRepository{
...
IDbContext context;
public void WriteCar(Car car){
context.WriteCar(car);
}
...
}
public interface IRepository{
...
void WriteCar(Car car);
...
}
public class MyDbContext : IDbContext{
...
public void WriteCar(Car car){
//The Actual Implementation here.
...
}
...
}
public interface IDbContext{
...
void WriteCar(Car car);
...
}
インタフェース:そして、ここ
は、コンポジションのルートであります継承することもできます!なぜ、ICarWriterインターフェースを持たず、次にIRepository:ICarWriter、ISoftwareSession:ICarWriterなどを持っているのでしょうか。 –
私はあなたのソフトウェアセッションの実装に問題があると考えています。これは、あなたのフレームワークにはデータベース、writeCar、writeCustomerなどに行くものがすべて表示されるため、Single Responsibilitiesに違反します。 – Dys1
@ BarryO'Kane私は同意します - これはインターフェイスをリファクタリングする方法であり、重複したコードの見方を減らすことに意味があります。私はこれを単純化する他の可能な方法を待っても構わない。 – user3141326