Pergunta

Cada objeto de negócios tem um objeto correspondente que contém chamadas SQL. Eu gostaria de restringir esses sql objetos de uma forma onde eles só podem ser usados ??pelo objeto de negócios correspondente. Como isso pode ser alcançado?

Atualizar

Greg trouxe o ponto sobre a capacidade de teste. Desde os SqlObjects conterá muito sql específica do processo de negócios que eu não quero que eles reutilizados em vários objetos buiness. (Operações CRUD básico são todos de código gerado) Existe uma maneira de fazer as SqlObjects acessível a apenas um objeto de negócios no ramo de montagem (como yshuditelu e Greg Beech mostrou) e expor a SqlObjects para a unidade de testes de montagem?

Foi útil?

Solução

Se esta é a abordagem que você quer ou necessidade de tomar, você poderia fazer o sql objetos aulas particulares dentro do objeto de negócios.

public class BusinessObject
{
    private class SqlObject { }
}

Além disso, fazendo uso de classes parciais, você pode separar isso em arquivos separados, se desejar.

//in one file
public partial class BusinessObject
{
    //business object implementation
}

//in another file
public partial class BusinessObject
{
    private class SqlObject { }
}

Joel faz um ponto bom em um comentário abaixo "do SQLObject ainda pode herdar de um tipo comum, para que coisas como conexão informações podem ser compartilhados entre as classes "internos" ". isso é absolutamente verdadeiro, e potencialmente muito benéfico.

Em resposta a sua edição, testes de unidade só pode testar classes públicas e funções (sem o uso de reflexão em seus testes). A única opção que eu posso pensar que iria fazer isso é:

  • fazer uma montagem por negócio / sql objeto par
  • mudar o private class SqlObject para internal class SqlObject
  • , em seguida, usar o [InternalsVisibleTo("UnitTestsAssembly")] para o projeto

Além disso, neste momento você não teria que manter o objeto sql como uma classe aninhada. De um modo geral, penso que este seria provavelmente adicionar mais complexidade do que o seu valor acrescentado, mas eu entendo completamente que cada situação é diferente, e se suas necessidades / expectativas estão te deixando isso, desejo-lhe bem. Pessoalmente, eu acho que eu iria com fazer o público SqlObjects (ou interna com internos visíveis para o teste de unidade), e aceitar o fato de que isso significa que as classes SQL são expostos a todas as classes de negócios.

Outras dicas

A única maneira de fazer isso é fazer o objeto SQL um tipo aninhado particular, i.

public class BusinessObject
{
    private class SqlObject
    {
    }
}

Se isto é uma boa ideia do ponto de vista da capacidade de teste é outra questão inteiramente ...

Você está attmepting para implementar o que é uma classe amigo em C ++. Tanto quanto eu sei C # e VB.Net não tem nada equivalente. A minha única sugestão é fazer com que a classe que você deseja restringir uma classe interna da classe que precisa acessá-lo.

Você também pode trabalhar com dois conjuntos (uma para objetos de negócios e um para os objetos SQL relacionados) e usar o modificador interna em cada classe SQL e usar então [InternalsVisibleTo("BusinessObjectAssembly")] para o SQLAssembly.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top