Come gestire la condivisione dello stesso contesto nei repository-Unità di lavoro quando si utilizza l'iniezione di dipendenza

0

Ho un problema che mi mette fuori gioco.

Sfondo: sono all'interno dello sviluppo di un'app WinForms non stratificata. Quasi tutti gli eventi sono gestiti nella classe Form.

  • Ho più IRepositories.
  • Inoltre, ho un'unità di lavoro con tutti loro.

Avvicinarsi al problema: ogni modulo viene iniettato una fabbrica dell'unità di lavoro da ogni evento che ne ha bisogno, chiama in fabbrica per ottenere una nuova istanza (quindi le connessioni possono essere eliminate dopo ogni utilizzo)

Codice

public interface IUnitOfWork : IDisposable
{
    ICarsRepository CarsRepository { get; }
    IMotorsRepository  MotorsRepository { get; }
}
public interface IUnitOfWorkFactory
{
    ICsoUnitOfWork Create();
}

public class OracleUoW : ICsoUnitOfWork
{ 
    private  DBObject OracleDbConnection;
    public ICarsRepository CarsRepository { get; private set;}
    public IMotorsRepository MotorsRepository { get; private set;}

    public OracleUoW()
    {
        OracleDbConnection= new ABDAE.DBObject();
        connect(ref OracleDbConnection);
        CarsRepository = new OracleCarsRepository(OracleDbConnection);
        MotorsRepository = new OracleMotorsRepository(OracleDbConnection);
    }

    public Dispose()
    {
        OracleDbConnection.Disconnect();
    }

}

Come vedi, inizio la connessione in ogni console di UnitOfWork. Ottengo una connessione pronta all'istanza DB.

Problema:

I want to make each IRespository get injected in the composition root, so I can get control of which repositories are being used in the app.

Non so come gestirlo perché: come vedi in queste righe = >

        CarsRepository = new OracleCarsRepository(OracleDbConnection);
        MotorsRepository = new OracleMotorsRepository(OracleDbConnection);

i repository devono condividere lo stesso oggetto di connessione.

Quindi arrivo alla seguente situazione:

1.Non posso passare le istanze dei repository nel costruttore all'interno di UnitOfWork (devono usare la costruzione posticipata per aggiungere loro lo stesso oggetto di database).

public OracleUoW(ICarsRepository CarsRepository ,IMotorsRepository  MotorsRepository)
{
     // How i Make them to share same DBObject? They have been newed up by the container
}

Se li converto in factories = > Func sarò in un'implementazione di fuga dal momento che i repository potrebbero essere basati sul web service in futuro.

public OracleUoW(Func<DBObject,ICarsRepository> CarsRepository, Func<DBObject,IMotorsRepository> MotorsRepository)
{
   //Leaking implementation ,i dont need DBObject in all implementations
} 

Che cosa posso fare? molti aiutano ragazzi, sei fantastico

    
posta Badulake 18.06.2018 - 15:54
fonte

0 risposte