对外界隐藏内部服务以确保使用正确的高级服务[关闭]

2024-02-04

我正在一个电子商务网站上工作。我有广告实体,其中包括属性和照片。属性写入数据库,照片存储在文件系统中。

我创建了一个WriterService在我的基础设施项目中,该服务负责保存广告...在幕后,它应该知道属性进入数据库,照片进入文件系统...但这个细节与外界无关...外界世界应该使用WriterService保存广告。

这是我的作家服务:

public class WriterService
{
    private DbWriter _dbWriter;
    private IFileWriter _fileWriter;

    // I believe I need to change the constructor in order to achieve my goal
    public WriterService(DbWriter dbWriter, IFileWriter fileWriter)
    {
        _dbWriter = dbWriter;
        _fileWriter = fileWriter;
    }

    public void WriterSomething(string text, Stream image)
    {
        _dbWriter.Write(text);
        _fileWriter.Write(image);
    }
}

现在在我的基础设施层中我实现了DbWriter and FileWriter, DbWriter看起来像这样:

public DbWriter
{
    public void Write(string text) {/* write text to DB */}
}

FileWriter可以有不同的实现:

public interface IFileWriter
{
   void Write(Stream image);
}

照片可以写入本地磁盘或AWS S3存储桶:

public DiskDriveWriter : IFileWriter
{
    public void Write(Stream image) {/* write image to Disk */}
}

public AWSCloudWriter : IFileWriter
{
    public void Write(Stream image) {/* write image to AWS */}
}

我想强制外部世界(我的解决方案中的其他项目)使用WriterService,所以如果他们想保存一些图像,他们不应该直接使用AWSCloudWriter,他们总是必须通过WriterService。可以强制执行吗?


Update

我为了避免一个很长的问题,我创建了这段代码审查 https://codereview.stackexchange.com/questions/231764/grouping-low-level-services-together-into-a-high-level-service解释我试图解决的问题。


我使用适配器将中间类映射到最终的 AWS/Disk 编写器,从而对实现者隐藏它们。

所有这些代码都位于单独的类库中

文件写入器

    internal interface IFileWriter
    {
        void Write(string text);
    }

两个实现 IFileWriter 的类

    internal class AWSWriter : IFileWriter
    {
        public void Write(string text)
        {
            //Write to AWS
        }
    }
    internal class DiskDriveWriter : IFileWriter
    {
        public void Write(string text)
        {
            //Write to disk
        }
    }

适配器的抽象基类

    public abstract class AbstractFileWriterAdapter
    {
        internal IFileWriter FileWriter { get; set; }
    }

两个适配器,一个用于 AWS,另一个用于 DiskWriter

    public class AWSFileWriterAdapter: AbstractFileWriterAdapter
    {
        public AWSFileWriterAdapter()
        {
            FileWriter = new AWSWriter();
        }
    }
    public class DiskDriveWriterAdapter:AbstractFileWriterAdapter
    {
        public DiskDriveWriterAdapter()
        {
            FileWriter = new DiskDriveWriter();
        }
    }

作家服务

public class WriterService
{
    AbstractFileWriterAdapter _writer;

    public WriterService(AbstractFileWriterAdapter writer)
    {
        _writer = writer;
    }

    public void WriteMessage(string text)
    {
        _writer.FileWriter.Write(text);
    }
}

最后来自不同项目的调用

            var awsAdapter = new AWSFileWriterAdapter();
            var service1 = new WriterService(awsAdapter);
            service1.WriteMessage("Some fancy text to AWS!!");


            var diskDriveAdapter = new DiskDriveWriterAdapter();
            var service2 = new WriterService(diskDriveAdapter);
            service2.WriteMessage("Some text to the drive!!");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对外界隐藏内部服务以确保使用正确的高级服务[关闭] 的相关文章

  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • “必须声明标量变量”错误[重复]

    这个问题在这里已经有答案了 必须声明标量变量 Id SqlConnection con new SqlConnection connectionstring con Open SqlCommand cmd new SqlCommand cm
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • 有没有一种非常简单的方法来处理 EDIFACT(例如 D96A)?

    我们是一家使用 XML 接口等现代技术的现代化公司 但我们的许多客户希望我们提供 EDIFACT 格式 如 D96A 的电子发票 不 我们不能使用现有的库 因为它们不是用我们的 Navision 软件使用的 C AL 编程语言编写的 因此
  • 使用 google gson 进行 json 对象序列化/反序列化

    我想将 java 对象序列化为 json 或从 json 反序列化 谷歌 gson 更好 让我有A类 class A int x 1 int y 2 然后 如果我调用 new Gson toJson new A 我将得到以下结果 x 1 y
  • Java - 在另一个线程中使用可变对象引用的首选设计?

    public class ObjectA private void foo MutableObject mo new MutableObject Runnable objectB new ObjectB mo new Thread obje
  • 使用 php sdk 在 facebook 中获取访问令牌时出错

    我正在使用的代码 fb new Facebook Facebook app id gt app id app secret gt app secret default graph version gt v2 6 helper fb gt g
  • 动态添加类后,jQuery 悬停处理函数在取消悬停时不起作用[重复]

    这个问题在这里已经有答案了 根据我的研究 我相信以下代码应该有效 我使用 jquery 动态地将图像添加到页面 它从 JSON 文件中提取这些图像 因此我需要使用 jQueryon http api jquery com on 方法来允许此
  • C99 中的易失性语义

    我对我正在编写的一些低级代码有疑问 我需要将对象用作易失性的 但这不一定是我希望将类型声明为易失性的 出于可重用性原因 然而 我可以定义指向结构的限定变体的指针 如下段所述 struct x int bar struct x foobar
  • 如何在express中重定向到post请求

    我正在创建一个登陆页面 点击该页面时会自动触发 Facebook 身份验证流程 但是 我无法自动从索引重定向到signup路线 如何从GET请求给一个POST要求快递 router get function req res redirect
  • 在列表框中搜索

    HI 我正在尝试将文本框放在列表框中进行搜索 我有一个 TextBox SearchText 其中包含以下代码 private void SearchText TextChanged object sender EventArgs e in
  • 如何获取意图服务中的上下文

    场景如下 我有一个 WakefulBroadcastReceiver 它执行以下操作 备份到网络计算机或云端 它设置为在 半夜 当我知道平板电脑可以访问 局域网 备份会将数据存储到实例化 WakefulBroadcastReceiver 的
  • visio 的 vba 编程

    目前 我正在IVR 交互式语音应答 系统工作 要在 IVR 中添加服务 我必须在 visio 中制作流程 该流程具有 IVR 系统卖家提供的预定义形状 形状是用 VBA 编程的 我决定学习VBA来修改预定义的形状 在google中搜索时 它
  • 属性更改时重新构建/重新渲染 Angular2 组件

    如何实施 我的子组件 import Component Input ngOnInit from angular2 core Component selector my component template div In child comp
  • 存储库名称作为 GitHub Action 环境变量?

    如何获取存储库名称 而不是用户或组织 作为 GitHub Actions 中的环境变量 我发现github repository但这包含所有者作为第一部分 如下所示 owner repo Try github event repositor
  • 如何控制 Honeycomb 中的软菜单按钮?

    我有一个应用程序 我想在其中关闭菜单按钮 我正在选择其他人的项目 并且不确定是什么引起了菜单按钮的出现 它没有 做任何事情 有没有办法手动关闭该图标 或者我必须首先找出它被显示的原因 请不要批评寻找解决方法 显然在理想的世界中 我会对代码足
  • C++11 std::bind 和 boost::bind 之间的区别

    两者有什么区别吗 或者我可以安全地替换每次出现的boost bind by std bind在我的代码中 从而消除对Boost的依赖 boost bind 关系运算符重载 http www boost org libs bind bind
  • 为 fa 圆添加边框

    如何给图片添加边框circleFont Awesome 的图标 其实我的结果是 http jsfiddle net 0jhdvj0k http jsfiddle net 0jhdvj0k 边框类似于省略号 而不是圆形边框 table cla
  • Jquery - 更改标签中的文本

    这是标签 有文字 使用 20 公里 使用 jquery 我想将文本 20 Kms 替换为 10 kms 我用手像这样贴上标签 label for applyDistanceSlab 我怎样才能做到这一点 label for applyDis
  • 在嵌套对象内搜索文本(以 Backbone.js 集合为例)

    我有一个backbone js 集合 我需要在其中进行全文搜索 我手头的工具如下 Backbone js 下划线 js jQuery 对于那些不熟悉主干的人 骨干集合只是一个对象 在集合内有一个包含模型的数组 每个模型都有一个带有属性的数组
  • CMake Qt UIC 失败

    我目前正在将我的项目从 qmake 移植到 CMake 并且我遇到了 Qt UIC 的问题 它尝试处理不存在的 UI 文件 而不是我希望它处理的实际文件 我有以下文件层次结构 CMakeLists txt MyProject pro mai
  • Visual Studio 解决方案——有什么方法可以创建“特殊”文件夹吗?

    基本上 我希望我的一个文件夹作为一种 特殊文件夹 出现在其他文件夹上方 类似于 属性 如何拥有自己的特殊位置 即使它是一个文件夹 与 App Data 等相同 这可能吗 默认情况下 Visual Studio 不支持添加特殊项目文件夹 Pr
  • 对外界隐藏内部服务以确保使用正确的高级服务[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在一个电子商务网站上工作 我有广告实体 其中包括属性和照片 属性写入数据库 照片存储在文件系统中 我创建了一个WriterService