tengo el siguiente repositorio ADO .NetIDisposable en un repositorio inyectada
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.
}
}
Este repositorio se inyecta con un contenedor IoC a un Servicio de dominio y se usa de esta manera:
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();
}
}
}
La idea es que siempre coloco el objeto Repository en una instrucción using para que cuando termine, la conexión se cierre y elimine, pero lo veo como un problema ya que la clase Domain Service todavía está activa y si hay una segunda llamada a la misma, fallará ya que el repositorio ya ha sido destruido.
Ahora tengo control total de todo el código y quiero diseñar solo llamadas de servicio de grano grueso, pero hay algo sobre todo lo que no se siente bien.
Lo estoy haciendo así, así puedo evitar que el Servicio de dominio conozca los métodos OpenConnection y CloseConnection en el repositorio.
¿Este diseño es inherentemente malo o hay una mejor manera de hacerlo?
Después de pensamiento: se está generando Todo el árbol de dependencias a nivel WCF cuando llega una petición y, por supuesto, se puede ver que la conexión se abre en ese momento, ya que sucede en el constructor del repositorio, por lo que creo que no es tan malo, ya que está abierto solo durante la duración de esta llamada en particular. ¿Estoy en lo cierto sobre esta suposición o estoy haciendo algo terriblemente malo abriendo la conexión de base tan temprano en el proceso?
¿'IRepository' está estrechamente relacionado con' Repository'? Es decir, ¿contiene los métodos, como 'Find'? Si es así, ¿esa interfaz implica 'IDisposable'? –
Tengo mi propia pregunta que podría estar relacionada con esto: [ServiceContainer, IoC y objetos desechables] (http://stackoverflow.com/questions/556580/servicecontainer-ioc-and-disposable-objects). –
¿Por qué necesita 'SqlConnection' en el' Repository'? Parece más como algo para su 'IUnitOfWork'. – Steven