Ho la seguente repository ADO NetIDisposable su un repository iniettato
public class Repository : IRepository, IDisposable
{
private readonly IUnitOfWork UnitOfWork;
private SqlConnection Connection;
public Repository(IUnitOfWork unitOfWork, connectionString)
{
UnitOfWork = unitOfWork;
Connection = new SqlConnection(connectionString);
Connection.Open();
}
public MyObject FindBy(string userName)
{
//...Ado .Net command.ExecuteReader, etc.
}
}
Questo repository viene iniettato con un contenitore CIO ad un Servizio di dominio e viene utilizzato in questo modo:
public class UserDomainService : IUserDomainService
{
private readonly IRepository Repository;
public UserDomainService(IRepository repository)
{
Repository = repository;
}
public User CreateNewUser(User user)
{
using(Repository)
{
var user = Repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!");
Repository.Add(user);
Repository.Commit();
}
}
}
L'idea è che metto sempre l'oggetto Repository in un'istruzione using così quando termina, la connessione viene chiusa e smaltita, ma la vedo come un problema poiché la classe Domain Service è ancora viva e se c'è una seconda chiamata ad essa, fallirà poiché il repository è già stato distrutto.
Ora ho il controllo completo di tutto il codice e desidero progettare solo chiamate di servizio a grana grossa, ma c'è qualcosa in tutto ciò che non sembra giusto.
Lo sto facendo in questo modo, così posso evitare che il servizio di dominio conosca i metodi OpenConnection e CloseConnection nel repository.
Questo design è intrinsecamente negativo o esiste un modo migliore per farlo?
Dopo pensiero: Tutto l'albero delle dipendenze viene generata a livello di WCF, quando arriva una richiesta e, naturalmente, si può vedere che la connessione viene aperta in quel momento in quanto accade nel costruttore del repository così credo che non è poi così male visto che è aperto solo per la durata di questa particolare chiamata. Ho ragione su questa ipotesi o sto facendo qualcosa di terribilmente cattivo aprendo la connessione DB così presto nel processo?
È 'IRepository' strettamente accoppiato a' Repository'? Significato, contiene i metodi di esso, come ad esempio 'Trova'? In tal caso, tale interfaccia implica 'IDisposable'? –
Ho una mia domanda che potrebbe riguardare questo: [ServiceContainer, IoC e oggetti usa e getta] (http://stackoverflow.com/questions/556580/servicecontainer-ioc-and-disposable-objects). –
Perché hai bisogno di 'SqlConnection' nel' Repository'? Sembra più qualcosa per il tuo 'IUnitOfWork'. – Steven