我处于需要修改从第三方开源应用程序(NopCommerce)中的静态存储库返回的内容的情况。问题是他们使用静态存储库,所以我不能仅仅继承一个接口并 DI 我自己的存储库。我试图在不修改 NopCommerce 代码库的情况下做到这一点......有什么新想法吗?
编辑:我希望 NopCommerce 使用我的存储库,而不是让我的代码使用他们的。
我处于需要修改从第三方开源应用程序(NopCommerce)中的静态存储库返回的内容的情况。问题是他们使用静态存储库,所以我不能仅仅继承一个接口并 DI 我自己的存储库。我试图在不修改 NopCommerce 代码库的情况下做到这一点......有什么新想法吗?
编辑:我希望 NopCommerce 使用我的存储库,而不是让我的代码使用他们的。
您可以通过创建自己的接口和委托给 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;
}
}
我们目前处于非常非常紧迫的最后期限,并且没有预见到这个问题。所以我想首先从一个穷人的静态接口/穷人的 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();
}
}
有什么想法吗?
听起来像是Facade的工作。