首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适配器模式下的C#依赖注入

适配器模式下的C#依赖注入
EN

Software Engineering用户
提问于 2015-06-05 17:59:58
回答 1查看 2.4K关注 0票数 3

在下面的代码示例中,我有一个通过控制器工作的客户机。在我的具体情况下,控制器在GPIB总线上建立到地址的会话。然后将它的一个实例注入客户机类,在我的示例中,客户机类是一个设备。客户端类知道应该对设备说什么,并使用控制器将这些消息传递给设备。

我遇到麻烦的地方是有各种各样的方式和设备交谈。到目前为止,我已经创建了ITextReader、ITextWriter、IBinaryReader、IBinaryWriter,将来可能会有更多。这些接口的实现是在适配器程序集中完成的,因为这是唯一知道如何与适配器对话的程序集。控制器和客户端仅对controller.api程序集具有引用。

那么,客户端如何请求适配器的TextReader实例,而它对此没有引用呢?我认为可以结合使用工厂模式和IoC容器(使用统一),但我无法提出一个设计,客户端可以获得任何这些读取器\写器实现的实例。

适配器组件:

代码语言:javascript
复制
public class Adapter : IAdapter
{
    public class Adapter(IAdaptee adaptee){..}
}

public class TextReader : TextReaderBase, ITextReader
{
    TextReader(IController controller)
    : base(controller)
    {..}

}

Controller.Api大会:

代码语言:javascript
复制
public interface IAdapter{...}
public interface ITextReader{...}
public interface ITextWriter{...}

控制器总成:

代码语言:javascript
复制
public class Controller : IController 
{
    Controller (IAdapter adapter){...}
}

public abstract class TextReaderBase : ITextReader
{
    TextReaderBase(IController controller){..}
}

客户大会:

代码语言:javascript
复制
public class Client : IClient
{
    Client (IController controller){...}
}

编辑6/6/2015:

我应该把我想做的事情弄清楚。第三方库(adaptee)具有较低的读写、打开连接等功能。建立连接、读、写的高级类是我所指的控制器。适配器将第三方库适配到此控制器。我创建了额外的接口来表示低级的读取器\编写器,比如IAdapterReader和IAdapterWriter。

客户端只通过控制器工作,对低级别适配器一无所知。在我当前的设计中,我计划有一个服务来读取一个配置文件,以找到要实例化的适配器和设备的地址。它创建此适配器的一个实例,将其注入控制器类,然后将控制器对象注入客户端。我在这里将控制器类称为“会话”,以表示到总线上特定地址的连接。这个想法是客户端知道对设备说什么(命令之类的),而控制器知道怎么说(可以访问物理层)。

为了让客户真正与设备对话,我想他们会要求一个阅读器和一个作者实例,但显然这不是依赖注入。如果客户端想要一个读取器\写器,它必须知道适配器的情况,因为我的高级读取器\写器封装了由适配器实现的低级别的读取器。

那么,我想问题是客户如何获得读者\作者呢?我可以通过向客户端注入ISession、ITextReader、ITextWriter、IBinaryReader、IBinaryWriter和它可能需要的任何其他接口来想出一种粗糙的方法。另一种方法是只注入ISession并使ISession有一个T Resolve<T>(Type type)方法。解析的实现可以通过IoC容器实现。我可以更改设计,以便在创建适配器对象时,它还可以使用从服务层传入的IoC容器的接口注册其所有实现。

EN

回答 1

Software Engineering用户

发布于 2015-06-06 15:39:00

现在我看到的是下面的依赖链:

代码语言:javascript
复制
client->controller->adapter->reader->controller

这确实创建了一个循环依赖项。

您可以使用依赖注入来实现依赖反转。也就是说,较高级别的代码不依赖于低级别代码的实现。

从链上看,我们可以证明有一段代码,无论是控制器还是文本读取器,都是高级别和低级别的。

如果客户机确实需要直接使用文本读取器,那么适配器不可能也使用它,因为您需要将它注入更高的位置。相反,您将把适配器插入到文本阅读器中。然后将文本读取器注入客户端。

但是如果我们这样做,并且在客户机和文本读取器上保持控制器的注入,那么,我们不是不正确地公开功能吗?因为您是说文本读取器与控制器的级别相同,并且控制器的级别低于文本读取器(因为它是注入的)。

最后,为什么客户端需要访问适配器使用的文本读取器?如果真的需要什么东西,您可以提供一个传递方法,它不会暴露下面某个地方有文本读取器的事实。

检查哪些功能将是较低级别的(哪个功能实际上负责写入/阅读),以及哪个功能将执行高级别的功能。把他们调到更高的水平,然后再往更高的地方注射。

在不看代码的情况下,我想象实际的顺序是

代码语言:javascript
复制
client->controller->adapter->text read/write 

事实上,文本读取器/写入器不需要知道控制器的情况,因为控制器是直接从/写到设备的。控制器所拥有的文本读取器/写入器所需的任何信息都将通过参数传递。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/285976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档