I가이 저장소 도메인 서비스에 IoC 컨테이너로 주입 등처럼 사용된다는 IDisposable
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.
}
}
다음 ADO 닷넷 저장소 :
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();
}
}
}
아이디어 나는 항상 Repository 객체를 using 문에 집어 넣는다. 그래서 끝날 때 커넥션은 닫히고 처리된다.하지만 Domain Service 클래스가 아직 살아 있고 거기에 두 번째 호출이 있기 때문에 문제가된다. 저장소가 이미 삭제 되었기 때문에 실패합니다.
이제 모든 코드를 완벽하게 제어 할 수 있었고 거친 곡물 서비스 호출 만 디자인하려고했지만 옳지 않은 모든 것에 대해 뭔가가있었습니다.
이렇게하면 도메인 서비스가 저장소의 OpenConnection 및 CloseConnection 메서드를 알고 있다는 것을 피할 수 있습니다.
본 설계가 본질적으로 좋지 않습니까? 아니면 더 좋은 방법이 있습니까?
생각한 후 : 요청이 도착할 때 모든 종속성 트리가 WCF 수준에서 생성되며 물론 저장소 생성자에서 발생하므로 그 순간에 연결이 열리는 것을 볼 수 있습니다. 이 특정 호출의 지속 기간 동안 만 열려 있기 때문에 그렇게 나쁘지 않습니다. 이 가정에 맞지 않습니까? 아니면 프로세스 초기에 DB 연결을 열어서 나쁘게 무언가를하고 있습니까?
'IRepository'는'Repository'와 밀접하게 결합되어 있습니까? 의미, 그것은'Find'와 같은 그것의 메소드를 포함합니까? 그렇다면 그 인터페이스는'IDisposable'을 암시합니까? –
나는 [ServiceContainer, IoC 및 일회용 객체] (http://stackoverflow.com/questions/556580/servicecontainer-ioc-and-disposable-objects)와 관련된 내 자신의 질문이 있습니다. –
왜'저장소 '에'SqlConnection'이 필요한가요? 'IUnitOfWork'에 대해 더 좋아 보입니다. – Steven