首页 > 解决方案 > 对外部世界隐藏内部服务,以确保使用正确的高级服务

问题描述

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

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);
    }
}

现在在我的基础设施层中,我实现了DbWriterand FileWriterDbWriter如下所示:

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. 可以强制执行吗?


更新

为了避免一个很长的问题,我创建了这个代码审查来解释我要解决的问题。

标签: c#interfaceencapsulationaccess-modifiers

解决方案


我使用了一个适配器将中间类映射到最终的 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!!");

推荐阅读