Нарушение принципов SOLID в множественной реализации интерфейса
Я сталкиваюсь с проблемой с инверсией зависимостей вfactory
метод, и это также нарушает принцип Open Closed. Мой код выглядит как коды ниже
public interface IWriter
{
void WriteToStorage(string data);
}
public class FileWriter : IWriter
{
public void WriteToStorage(string data)
{
//write to file
}
}
public class DBWriter : IWriter
{
public void WriteToStorage(string data)
{
//write to DB
}
}
Теперь я использую фабричный класс для решения создания объекта. Это похоже на код ниже
public interface IFactory
{
IWriter GetType(string outputType);
}
public class Factory : IFactory
{
public IWriter GetType(string outputType)
{
IWriter writer = null;
if (outputType.Equels("db"))
{
writer = new FileWriter();
}
else if (outputType.Equels("db"))
{
writer = new DBWriter();
}
}
}
Теперь проблема заключается вFactory
класс ломаетсяОткрытый закрытый принцип так и ломаетсяПринцип обращения зависимостей
А потом
public interface ISaveDataFlow
{
void SaveData(string data, string outputType);
}
public class SaveDataFlow : ISaveDataFlow
{
private IFactory _writerFactory = null;
public SaveDataFlow(IFactory writerFactory)
{
_writerFactory = writerFactory;
}
public void SaveData(string data, string outputType)
{
IWriter writer = _writerFactory.GetType(outputType);
writer.WriteToStorage(data);
}
}
Поскольку вышеупомянутый фабричный класс нарушает инверсию зависимости, я удаляюFactory
класс и изменитьSaveDataFlow
класс как ниже
public class SaveDataFlow : ISaveDataFlow
{
private IWriter _dbWriter = null;
private IWriter _fileWriter = null;
public SaveDataFlow([Dependency("DB")]IWriter dbWriter,
[Dependency("FILE")]IWriter fileWriter)
{
_dbWriter = dbWriter;
_fileWriter = fileWriter;
}
public void SaveData(string data, string outputType)
{
if (outputType.Equals("DB"))
{
_dbWriter.WriteToStorage(data);
}
else if (outputType.Equals("FILE"))
{
_fileWriter.WriteToStorage(data);
}
}
}
И разрешил эти зависимости, используя Unity Framework
container.RegisterType<IWriter, DBWriter>("DB");
container.RegisterType<IWriter, FileWriter>("FILE");
Тем не менее, в конце концов я заканчиваю тем, что ломаюсьОткрытый Закрытый Принцип, Мне нужен лучший дизайн / решение для решения такой проблемы, но я должен следовать принципам SOLID.