-2

这是一个有点笼统的问题。假设我在 A.dll 中有一个类 X,B.dll 引用 A.dll,C.dll 引用 B.dll。

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

谢谢。

4

2 回答 2

1

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

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

假设您想要一个包装器(而不仅仅是继承 X),我建议您只需创建一个手动包装器。即创建一个类 X1,它有一个类型为 X 的私有变量。通过调用 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();
   }
}
于 2012-10-18T22:52:14.143 回答
0

我认为几乎没有简单的解决方案:我相信您正在计划洋葱层/架构。

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

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

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

于 2012-10-19T04:59:14.087 回答