위대한 질문과 이미 두 가지 큰 답변. 처음에는 당황스럽고 다음과 같은 해결책으로 관리자에게 저장소를 캡슐화하는 문제를 해결했습니다. 관리자는 연결 문자열을 추출하여 리포지토리에 주입해야합니다.
모의 콘솔 앱에서 말하는 리포지토리를 개별적으로 테스트하는 방법을 찾았습니다. 더 큰 규모의 여러 프로젝트에서이 패턴을 따르는 것이 좋습니다. 비록 필자가 테스트, 의존성 주입, 또는 무엇인가에 대한 전문가는 아니지만 정말로 그렇습니다!
나 자신에게 묻는 왼쪽 질문은 DbService가 싱글 톤인지 여부입니다. 나의 근거는 DbService
에 캡슐화 된 다양한 저장소를 끊임없이 생성하고 파괴하는 것이별로 중요하지 않았기 때문이며, 그들은 모두 무국적이기 때문에 "살아야"하는 데 많은 어려움을 겪지 않았습니다. 이것은 완전히 무효 논리가 될 수 있지만.
편집 :
/*
* Db Service
*/
public interface IDbService
{
ISomeRepo SomeRepo { get; }
}
public class DbService : IDbService
{
readonly string connStr;
ISomeRepo someRepo;
public DbService(string connStr)
{
this.connStr = connStr;
}
public ISomeRepo SomeRepo
{
get
{
if (someRepo == null)
{
someRepo = new SomeRepo(this.connStr);
}
return someRepo;
}
}
}
샘플 저장소가 구성 될 것이다 : 당신은 다음과 같은 준비가 만든 솔루션 저장소 관리자의 구조 GitHub
내 말끔 저장소 구현을 확인하려는해야 다음과 같습니다 :
배선 모두 최대 : 그것을 사용
/*
* Startup.cs
*/
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//...rest of services
services.AddSingleton<IDbService, DbService>();
//...rest of services
}
마지막을 :
public SomeController : Controller
{
IDbService dbService;
public SomeController(IDbService dbService)
{
this.dbService = dbService;
}
public IActionResult Index()
{
return View(dbService.SomeRepo.List());
}
}
나는 공장 접근 방식을 좋아하지만 어떻게 하나는 하나의 응용 프로그램에 대해 여러 데이터 소스의 (데이터베이스)와 함께 시나리오를 처리 할 것인가? 데이터베이스 당 자식'ISomeDbConnectionFactory'을 생성하고 추가 매개 변수를 팩토리에 전달하여 어떤 연결을 생성해야하는지 결정하십시오. 아니면 더 우아한 뭔가? –
동일한 저장소가 단일 데이터 소스에 대한 연결을 사용한다고 가정합니다. 이 경우 데이터 소스 특정 연결 팩토리의 접근 방식을 사용합니다. 팩토리의 인터페이스는 동일 할 수 있으며, DB 전용 구현 일 수 있습니다. –
MARS를 사용하는 경우에도 동일한 'SqlConnection'을 사용하여 여러 동시 요청을 처리 할 수 없습니다. [MSDN] (https://msdn.microsoft.com/en-us/library/h32h3abf (v = vs.110) .aspx)에 따르면 : "MARS 작업은 스레드로부터 안전하지 않습니다". – Steven