Modo corretto per iniettare dipendenze nel servizio di logica aziendale?

1

Attualmente la struttura della mia domanda è la seguente App Web - > Servizio WCF (solo una facciata) - > Servizi di business logic - > Repository - > Entity Framework Datacontext

Ora ognuno dei miei servizi di business logic dipende da più di 5 repository (ho interfacce definite per tutti i repository) e sto facendo un'iniezione di Constructor proprio ora (povere mans DI invece di usare un IOC corretto come è stato determinato che sarebbe un eccesso per il nostro progetto). I repository hanno riferimenti ai datacontex EF. Ora alcuni dei metodi nel servizio di logica aziendale richiedono solo uno dei 5 repository, quindi se dovessi chiamare quel metodo finirò per creare un servizio che instituirà tutti e 5 i repository che è uno spreco. Un esempio:

public class SomeService : ISomeService
{
   public(IFirstRepository repo1, ISecondRepository repo2, IThirdRepository repo3)
   {}

   // My DoSomething method depends only on repo1 and doesn't use repo2 and repo3
   public DoSomething()
   {
        //uses repo1 to do some stuff, doesn't use repo2 and repo3
   }   

   public DoSomething2()
   {
     //uses repo2 and repo3 to do something, doesn't require repo1
   }

   public DoSomething3()
   {
     //uses repo3 to do something, doesn't require repo1 and repo2
   }
}

Ora se devo usare DoSomething metodo su SomeService Finisco per creare sia IFirstRepository, ISecondRepository e IThirdRepository ma usando solo IFirstRepository, ora questo mi disturba, posso sembrare accettare che sono un-necessariamente creare repository e non usarli.

È un progetto corretto? Ci sono alternative migliori? Dovrei guardare l'istanza Lazy Lazy<T> ?

    
posta Sri Harsha Velicheti 19.05.2014 - 20:28
fonte

2 risposte

1

ISP afferma:

no client should be forced to depend on methods it does not use

Sebbene tu stia utilizzando tutti i metodi dai 5 repository, probabilmente li stai utilizzando in diversi contesti e probabilmente da diverse istanze del servizio (è difficile capire lo scenario di utilizzo dall'esempio di codice generico che hai fornito).

Inoltre, i tuoi servizi sembrano fare più di una cosa e dovrebbero essere suddivisi in componenti più piccoli (avere 4 o più dipendenze è spesso un'indicazione di rottura SRP ).

Consigli: dovresti provare DI. Non è decisamente eccessivo e ne trarrai dei benefici.

    
risposta data 19.05.2014 - 22:51
fonte
-1

Estrarre ciascun metodo del servizio in un comando, quindi utilizzare un contenitore DI per istanziare il comando corretto con i parametri corretti. Tirando ciascun metodo in un comando non imponi più comandi separati da utilizzare per le dipendenze condivise.

In pratica il DI del tuo povero potrebbe essere:

public delegate T Factory<T>;

public class SomeService : ISomeService
{
   public(Factory<IFirstRepository> repo1Factory, /* ... */)
   {}

   // My DoSomething method depends only on repo1 and doesn't use repo2 and repo3
   public DoSomething()
   {
        //uses repo1 to do some stuff, doesn't use repo2 and repo3
       var handler = new DoSomethingHandler(repo1Factory());
       handler.Execute();
   }   

}
    
risposta data 22.05.2014 - 09:54
fonte

Leggi altre domande sui tag