Breaking SOLID Principles in mehrfacher Implementierung einer Schnittstelle

Ich stehe vor einem Problem mit der Abhängigkeitsinversion in einemfactory Methode und es bricht auch Open Closed-Prinzip. Mein Code sieht wie folgt aus: codes

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

Jetzt benutze ich eine Factory-Klasse, um die Objekterstellung zu lösen. Es sieht aus wie unter Code

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

Nun ist das Problem dasFactory Klasse brichtffenes geschlossenes Prinz so bricht es auchDependency Inversion Principle

Und dan

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

Da die obige Factory-Klasse die Abhängigkeitsinversion unterbricht, entferne ich dasFactory Klasse und ändern Sie dieSaveDataFlow Klasse wie unten

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

Und diese Abhängigkeiten wurden mit Unity Framework gelöst

container.RegisterType<IWriter, DBWriter>("DB");
container.RegisterType<IWriter, FileWriter>("FILE");

Yet schließlich bin ich am Ende brechenGeschlossenes Prinzip öffnen. Ich brauche ein besseres Design / eine bessere Lösung, um ein solches Problem zu lösen, aber ich muss die SOLID-Prinzipien befolgen.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage