【问题标题】:C#: pass an instance of a class from one module to anotherC#:将一个类的实例从一个模块传递到另一个模块
【发布时间】:2021-01-18 00:53:24
【问题描述】:

我有两个模块,它们可以同时存在于目标中,也可以单独存在。我们称他们为ModuleAModuleB

ModuleA 有一个特定的类型,我想在ModuleB 中使用它,我们称之为SpecificType。但是,我仍然希望能够单独包含 ModuleB(没有 ModuleA)。

是否可以通过使用接口/协议来解决此问题?我感兴趣的是具有特定接口的对象将作为参数传递,因此不可能传递例如一个字符串。

ModuleB中的示例方法:

// SpecificType is coming from ModuleA

public void MyMethod(SpecificType myVariableName) {

}

我可能想要的是类似这样的东西:

// SpecificType is coming from ModuleA, SpecificTypeInterface from ModuleB
// SpecificType implicitly conforms to SpecificTypeInterface

public void MyMethod(SpecificTypeInterface myVariableName) {

}

【问题讨论】:

  • 这个问题是关于传递类型(尝试泛型)还是关于程序集(您可以创建 C 程序集以包含基本类型并且 A、B 使用它)?
  • 你不能命名变量object,因为它是一个关键字。
  • 问题是关于在另一个模块中使用一个模块的类型而不依赖于第一个模块。所以我认为它可以通过使用接口来解决
  • @RichardTopchii,当然——你需要使用接口和依赖注入。然后可以在执行过程中通过一些 CI 注入具体的模块实现。
  • 调用者(即应用程序目标)是否必须手动链接 ModuleB 接口和 ModuleA 类?

标签: c# types module interface dependencies


【解决方案1】:

如果您有一些模块需要共享接口/类型,但您不希望这些模块之间存在依赖关系,则需要另一个模块,其中定义了接口/类型。

一般来说,这个其他模块具有前缀Abstractions,例如Microsoft.Extensions.Logging.Abstractionsxunit.abstractions

在你的情况下:

模块抽象

public interface ISpecificTypeInterface
{
    void Foo();
}

模块A

public class SpecificType : ISpecificTypeInterface
{
    public void Foo()
    {
        Console.WriteLine("From ModuleA")
    }
}

模块B

public void MyMethod(ISpecificTypeInterface spe)
{
    spe.Foo();
}

ModuleA 和 ModuleB 依赖于 ModuleAbstractions。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2016-08-28
    • 2017-08-19
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多