У меня возникла проблема с инверсией зависимостей в методе factory
, а также нарушена принцип открытого закрывания. Мой код выглядит следующим образом:Нарушение принципов SOLID при множественном внедрении интерфейса
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
класс нарушает Открытый закрыт принцип так и ломает Dependency Inversion Принцип
А потом
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
как belo ж
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.
Мне кажется, что вы не хотите завод. На самом деле вам нужен шаблон стратегии. Однако, если вы выполняете '[Dependency (« DB »)], вы связываете себя с картой DI, которая также не идеальна. –
Почему 'SaveDataFlow' должен работать со строковыми типами ввода? Не можете ли вы просто вставить надлежащего писателя? Что касается фабрики, если вы хотите сделать ее расширяемой, вы можете использовать отражение для сканирования сборок и найти всех разработчиков «IWriter», чтобы зарегистрировать их автоматически. – plalx