Atualmente, estou projetando uma solução de n camadas que usa o Entity Framework 5 (.net 4) como estratégia de acesso a dados, mas estou preocupada em como incorporar a injeção de dependência para torná-lo testável / flexível.
Meu layout de solução atual é o seguinte (minha solução é chamada Alcatraz):
Alcatraz.WebUI : um projeto de formulário da web asp.net, a interface do usuário front-end, faz referência aos projetos Alcatraz.Business e Alcatraz.Data.Models .
Alcatraz.Business : Um projeto de biblioteca de classes, contém a lógica de negócios, faz referência a projetos Alcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : um projeto de biblioteca de classes, abriga AlcatrazModel.edmx e AlcatrazEntities
DbContext, faz referência a projetos Alcatraz.Data.Models .
Alcatraz.Data.Models : um projeto de biblioteca de classes, contém POCOs para o modelo Alcatraz, sem referências.
Minha visão de como essa solução funcionaria é que a Web-UI instanciaria um repositório dentro da biblioteca de negócios, esse repositório teria uma dependência (através do construtor) de uma cadeia de conexão (não uma AlcatrazEntities
instância). O web-ui conheceria as cadeias de conexão do banco de dados, mas não que fosse uma cadeia de conexão da estrutura da entidade.
No projeto de negócios:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
Na interface da Web:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
Tenho algumas perguntas relacionadas a este design.
Esse design ainda faz sentido em termos de recursos do Entity Frameworks? Ouvi dizer que a estrutura do Entity já usa o padrão Unidade de trabalho, estou adicionando outra camada de resumo desnecessariamente?
Não quero que meu web-ui se comunique diretamente com o Entity Framework (nem faça referência a ele), quero que todo acesso ao banco de dados passe pela camada de negócios, pois no futuro terei vários projetos usando a mesma camada de negócios (serviço web, aplicativo windows, etc.) e desejo facilitar a manutenção / atualização, tendo a lógica de negócios em uma área central. Essa é uma maneira apropriada de conseguir isso?
A camada de negócios deve conter repositórios ou deve estar contida na camada de acesso? Se está tudo bem, a passagem de uma cadeia de conexão é uma boa dependência a ser assumida?
Obrigado por reservar um tempo para ler!
DbContext
como sua dependência. As classes de negócios têm repositórios como uma dependência. Para a injeção de dependência, estou fazendo isso manualmente (para entender o que está acontecendo). O motivo pelo qual desejo poder definir a cadeia de conexãoDbContext
é usar o sharding do banco de dados; em certos casos, preciso ter uma estrutura de entidade para conectar-se a diferentes bancos de dados (da mesma estrutura). Eu entendo você corretamente?