サードパーティのオープンソースアプリケーション(NopCommerce)の静的リポジトリから返されるものを変更する必要がある状況にあります。問題は、それらが静的リポジトリーを使用していることです。そのため、私は単にインターフェースを継承し、自分のリポジトリーをDIすることはできません。NopCommerceコードベースを変更せずにこれを実行しようとしています...新鮮なアイデアはありますか?
編集:コードにリポジトリを使用させるのではなく、NopCommerceにリポジトリを使用させたい。
サードパーティのオープンソースアプリケーション(NopCommerce)の静的リポジトリから返されるものを変更する必要がある状況にあります。問題は、それらが静的リポジトリーを使用していることです。そのため、私は単にインターフェースを継承し、自分のリポジトリーをDIすることはできません。NopCommerceコードベースを変更せずにこれを実行しようとしています...新鮮なアイデアはありますか?
編集:コードにリポジトリを使用させるのではなく、NopCommerceにリポジトリを使用させたい。
現在、非常に厳しい締め切りが迫っていますが、この問題は予見されていませんでした。だから私は最初に次のような貧乏人の静的インターフェース/貧乏人のDIから始めることを考えています(それで私はソリューション全体を変更する必要はありません)。その後、時間があまりないときに、インターフェイスと依存性注入を使用するように切り替えて、パッチをNopCommerceに送信します。
// Poor-man's static interface (DI).
public static class OriginalBuiltInStaticClass {
private static IMyNewClass _myNewClass;
public static void Inject(IMyNewClass myNewClass) {
_myNewClass = myNewClass;
A = _myNewClass.A;
B = _myNewClass.B;
C = _myNewClass.C;
}
public static Action A = CopySimpleRenameBuiltInStaticClass.A;
public static Func<int, string> B = CopySimpleRenameBuiltInStaticClass.B;
public static Action C = CopySimpleRenameBuiltInStaticClass.C;
}
// Original vendor class which was copied and renamed.
public static class CopySimpleRenameBuiltInStaticClass {
public static void A() {
Console.WriteLine("OriginalBuiltInStaticClass.A()");
}
public static string B(int id) {
Console.WriteLine("OriginalBuiltInStaticClass.B()");
return id.ToString();
}
public static void C() {
Console.WriteLine("OriginalBuiltInStaticClass.C()");
}
}
// Creating an interface to merge into trunk of NopCommerce (convert static repositories)
public interface IMyNewClass {
void A();
string B(int id);
void C();
}
// Implementation of interface.
public class MyNewClass : IMyNewClass {
public void A() {
Console.WriteLine("MyNewClass.A()");
}
public string B(int id) {
Console.WriteLine("MyNewClass.B()");
return id.ToString();
}
public void C() {
CopySimpleRenameBuiltInStaticClass.C();
}
}
何かご意見は?
独自のインターフェースとNopCommerceに委任するクラス実装を作成することで、それらを抽象化することができます。次に、NopCommerceのクラスに直接アクセスする代わりに、コードでインターフェイスを使用します。結果がアプリケーションに返される前に、クラス内のNopCommerceの出力を変更できます。
また、追加のボーナスとして、本格的なリポジトリの実装を必要としないいくつかのテストを実行するために、インターフェースをモックすることもできます。
コードでこのようなもの:
public interface IRepository
{
MyItem GetItem(int id);
}
public class MyNopCommerceWrapper : IRepository
{
public MyItem GetItem(int id)
{
// I have no idea what NopCommerce API looks like, so I made this up.
var myItem = NopCommerce.GetItem(id);
ModifyMyItem(myItem);
return myItem;
}
}
ファサードの仕事のようですね。