在C#中制作完美的包装器

时间:2012-10-18 22:47:57

标签: c#

这是一个普遍的问题。假设我在A.dll中有一个X类,而B.dll引用A.dll和C.dll引用B.dll。

现在,我需要在C.dll(消费者代码)中使用X.所以我想要做的是在B.dll中创建一个包装器类X1并在消费者代码中使用它。所以这是问题所在?如何让X1成为一个(几乎)完美的X包装?

感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用X或继承自X的类,.NET要求您直接引用A.dll。假设您不希望消费者C.dll直接引用A.dll,有两种方法。如果你想完全隐藏X,你应该创建一个真正的包装器(参见下面的例子)。另一种方法是使用后期绑定(不推荐,但C只能通过间接程序集引用访问X)。

使用静态类型包装器(首选方法)

假设你想要一个包装器(而不仅仅是继承X),我建议你只需创建一个手动包装器。即创建一个具有类型X的私有变量的类X1。通过调用X中的相应成员来实现X的所有公共函数和属性。如果你需要的只是X的包装而没有别的,那么这将起作用。通过这种方式,您可以从B隐藏X(我认为这就是您想要的)。

A.DLL

public class X {
   public int A { get; set; }
   public bool DoSomething() {
      A++;
   }
}

B.DLL

public class X1 {
   private X X;
   X1() {
       X = new X();
   }
   public int A { get { return X.A; } set { X.A = value } }
   public bool DoSomething() {
      return X.DoSomething();
   }
}

使用后期绑定(不需要手动包装)

从技术上讲,它不是一个包装器,但如果你想避免A.dll作为C.dll的直接引用

第三种方法是不包装X,而是使C.dll使用X作为未知对象。此方法使用C#中的调用站点和“动态”对象。这允许B.dll返回真正的X,而不必在编译时从C.dll显式引用它(假设你有充分的理由不这样做)。 Microsoft为C.dll的每个属性/函数调用创建了所谓的“调用站点”,因此开销非常低。这使得X非常完美,因为它确实是X.动态方法的好处是包装器将跟随对X的任何更改。坏的是C.dll将具有运行时绑定(没有编译错误)。

public static class X1 {
   public static dynamic New() {
      return new X();
   }
}

答案 1 :(得分:0)

我认为很少有简单的解决方案: 我相信你正在计划洋葱层/建筑。

  1. 在'B'的X1类中继承'C'的X类,然后在'A'中使用X1。

  2. 在“B”的类X1中为“C”的X类创建一个工厂方法,然后在“A”中使用它。

  3. 在'B'的X1中创建'C'的X类对象并编写您想要的每个方法,并从这些方法将调用转发到原始类X.