Come disaccoppiare una dipendenza

-3

Sto cercando di disaccoppiare una dipendenza da Book Class a BookStorage, ma ho confuso come farlo correttamente. Qualcuno può dirmi come disaccoppiare questo correttamente? Ecco il mio codice:

    public interface IBook
    {
        string Execute(Guid bookId);
    }

    public class Book : IBook
    {
        public string Execute(Guid bookId)
        {
            var Id = 2;
            var storage = new BookStorage(Id);// Decouple this dependency? 

            // Get data
            var response = storage.GetBookData("GOF");
            return response;
        }
    }


    public interface IBookStorage
    {
        string GetBookData(string name);
    }


    public class BookStorage : IBookStorage
    {
        public BookStorage(int id)
        {

        }
        public string GetBookData(string bookName)
        {
            throw new NotImplementedException();
        }
    }
    
posta GeekOnGadgets 26.01.2017 - 10:34
fonte

1 risposta

6

Il punto di dipendenza-iniezione è di non creare le dipendenze all'interno della classe, ma di delegare tale attività al codice chiamante. Quindi, invece di creare una nuova istanza di BookStorage nel tuo Execute -method, passa come parametro, usando l'interfaccia IBookStorage .

public string Execute(Guid bookId, IBookStorage bookStorage)
{
    var Id = 2;

    // Get data
    var response = bookStorage.GetBookData("GOF");
    return response;
}

Ciò cambierebbe anche l'interfaccia. Se non vuoi farlo, puoi anche passare la dipendenza tramite l'iniezione del costruttore:

var book = new Book(new BookStorage("GOF"));

che avrà bisogno di questo costruttore

class Book
{
    private readonly IBookStorage storage;
    public Book(IBookStorage storage)
    {
        this.storage = storage;
    }
}

EDIT: per migliorare ulteriormente questo aspetto, è possibile risolvere questa dipendenza utilizzando un contenitore di dipendenze-injection come NInject o simile. Ma questo è troppo lontano per una domanda qui su SO.

    
risposta data 26.01.2017 - 10:38
fonte

Leggi altre domande sui tag