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?Alguns comentários rápidos. Eu, pessoalmente, provavelmente não passaria uma string de conexão. Se alguma coisa eu tentaria criar interfaces talvez para os repositórios e apenas passar as interfaces? Faça com que os repositórios implementem ou exponham uma interface IOW.
Dessa forma, o evento não precisa ser um banco de dados que implemente seus repositórios. eles podem ser um cache de memória ou qualquer coisa. Talvez você possa usar algum tipo de estrutura de injeção de dependência para instanciar isso mesmo?
Então, em resposta a algumas de suas perguntas:
Estes são apenas alguns pensamentos para refletir.
fonte