【发布时间】:2023-09-25 17:20:01
【问题描述】:
我正在开发一个电子商务网站。我有包含属性和照片的广告实体。属性写入数据库,照片存储在文件系统中。
我在我的基础设施项目中创建了一个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 和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,他们总是必须通过@987654335 来执行此操作@。可以强制执行吗?
更新
为了避免一个很长的问题,我创建了this code review 来解释我要解决的问题。
【问题讨论】:
-
那么,有什么问题呢?你删除了如果你创建这些类
internal你会得到一个编译时错误的声明。这是唯一可以远程理解的问题陈述或合法问题。那么是你的问题是什么?您需要提供一个良好的minimal reproducible example,清楚地显示问题是什么,并准确解释该代码的作用,包括任何错误消息的确切文本,以及原因你想不出解决办法。 -
@HoomanBahreini 过于关注实现细节。抽象 writer 服务并将其公开。如果抽象和实现存在于同一个程序集中,则让该项目管理与 IoC 容器的注册。这样消费者只知道服务抽象而不知道它的依赖关系。
-
顺便说一句:通常的方法是提供一个工厂类,其中接口类型(在本例中为
IFileWriter)是公共的,但没有一个实现类。工厂类是公共的,并为外部代码提供了一种机制来创建IFileWriter的实例,而无需知道实际类型。这可能适用于您的情况,但您没有提供任何细节让任何人都可以肯定地知道这一点,更不用说工厂类的具体外观了。 -
我同意@PeterDuniho 的建议。
-
旁注:目标似乎是让你的图书馆用户的生活更加艰难——虽然人们可以轻松地模拟一个测试接口,但用合理设计的类很难做到这一点(而且几乎不可能用什么这个问题似乎试图实现)
标签: c# interface encapsulation access-modifiers