3

我处于需要修改从第三方开源应用程序(NopCommerce)中的静态存储库返回的内容的情况。问题是他们使用静态存储库,所以我不能仅仅继承一个接口并 DI 我自己的存储库。我试图在不修改 NopCommerce 代码库的情况下做到这一点......有什么新想法吗?

编辑:我希望 NopCommerce 使用我的存储库,而不是让我的代码使用他们的。

4

3 回答 3

3

您可以通过创建自己的接口和委托给 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;
   }
}
于 2010-08-21T20:18:23.137 回答
3

我们目前处于非常非常紧迫的最后期限,并且没有预见到这个问题。所以我想首先从一个穷人的静态接口/穷人的 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();
    }

}

有什么想法吗?

于 2010-08-22T02:00:14.447 回答
2

听起来像是Facade的工作。

于 2010-08-21T20:18:30.890 回答