Na minha camada de domínio temos a classe:
public class Telefone : IEntity
{
public virtual int Id { get; protected internal set; }
public virtual string Tipo { get; set; }
public virtual string Numero { get; set; }
}
O Id é protegido interno. Isso é proposital, quem gera o Id é o banco de dados e deve ser ReadOnly.
Já na camada de teste, deve-se ter acesso ao setter desta propriedade.
Então, em minha camada de domínio, adicionei o atributo em AssemblyInfo.cs:
[assembly: InternalsVisibleTo("MyTestLayer")]
Isso me permitirá definir o Id na camada de testes, mas não na camada de domínio!
Na camada de teste
novo Telefone (). Id = 1; // Trabalho!!
Na camada da IU
novo Telefone (). Id = 1; // Não compilar! Não funciona!
var pessoa = fix.Build<Pessoa>()
.With(p => p.Nome)
.Do((pess) =>
{
fix.Build<Telefone>()
.With(p => p.Id)
.With(p => p.Tipo)
.With(p => p.Numero)
.OmitAutoProperties()
.CreateMany(10).ToList().ForEach(pess.Telefones.Add);
fix.Build<Email>()
.With(p => p.Id)
.With(p => p.Tipo)
.With(p => p.Endereco)
.OmitAutoProperties()
.CreateMany(10).ToList().ForEach(pess.Emails.Add);
})
.OmitAutoProperties()
.Create();
Teoricamente, o código acima deve funcionar, mas quando meu teste de estrada ocorre um erro:
A propriedade "Id" é somente leitura.
Todas as propriedades Id
s são protected internal
.
No mesmo arquivo, o mesmo teste pode fazer algo como:
novo Telefone (). Id = 1; // Trabalho!!
novo e-mail (). Id = 1; // Trabalho!!
Isso indica claramente que você tem uma _ abstração vazada_ em seu Modelo de Domínio. Um Modelo de Domínio não deve ser projetado com nenhuma tecnologia de fronteira específica em mente.
Esse problema específico está dizendo claramente que seu Modelo de Domínio _não_ pode ser reutilizado.
InternalsVisibleTo
não tem efeito porque só permite o acesso à sua biblioteca de teste, mas o AutoFixture é um assembly totalmente diferente. Isso apenas informa que _nenhum_ outro cliente poderá reutilizar seu Modelo de Domínio.
O melhor curso de ação é reconsiderar o design da API. Normalmente, eu faria algo assim:
`` `c #
classe pública Telefone: IEntity
{
telefone público (int id)
{
this.Id = id;
}
public virtual int Id { get; private set; }
public virtual string Tipo { get; set; }
public virtual string Numero { get; set; }
}
`` `
Isso gerou muita discussão em um grupo de arquitetura que sigo.
Há um grande problema com essa abordagem:
max (id) + 1
e, em seguida, definiria o Id do meu objeto. Mas como definir o Id se for somente leitura?Concordou que todos esses são _problemas_. Todos os quatro indicam _fortemente_ que o Modelo de Domínio depende da camada de persistência e não pode funcionar sem ela.
Eu entendo o problema. Não consigo mudar o tipo de PKs para Guid, realmente funcionaria.
Eu entendo agora que o problema não está relacionado ao AutoFixture, mas se você estiver interessado. Eu crio um projeto de amostra para discutir isso.
obrigado.