繁体   English   中英

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

[英]Making the perfect wrapper in C#

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

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

谢谢。

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

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

假设您想要一个包装器(而不仅仅是继承 X),我建议您只需创建一个手动包装器。 即创建一个具有 X 类型私有变量的类 X1。通过调用 X 中的相应成员来实现 X 的所有公共函数和属性。如果您只需要 X 的包装器而不是其他任何东西,这将起作用。 这样,您就可以对 B 隐藏 X(我假设这就是您想要的)。

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. 在“B”的 X1 类中继承“C”的 X 类,然后在“A”中使用 X1。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM