c# - 对外部世界隐藏内部服务,以确保使用正确的高级服务
问题描述
我正在做一个电子商务网站。我有包含属性和照片的广告实体。属性写入数据库,照片存储在文件系统中。
我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
. 可以强制执行吗?
更新
为了避免一个很长的问题,我创建了这个代码审查来解释我要解决的问题。
解决方案
我使用了一个适配器将中间类映射到最终的 AWS/Disk 写入器,从而将它们隐藏在实施者面前。
所有这些代码都在一个单独的类库中
IFileWriter
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!!");
推荐阅读
- visual-studio - TFS/VS 工作区映射问题
- python - python中的二维牛顿法
- text - 如何在 three.js 中使用 2D 文本形状正确切割平面?
- excel - 我如何计算这 2 个日期的门票?
- ms-access-2010 - Access 2010 - 表单上的超链接别名
- ios - 重复的模块名称:react-native
- android - 删除条目 - Firebase
- ios - 请求图像时 PHAssetManager 忽略 targetSize?
- string - Lua:如何打印多行字符串/变量?
- php - 如何使用 Respect\Validation 库验证文件上传?