Domanda

Ho accennato a questo problema nel mia altra domanda , ma penso che sia pena la rottura fuori nella propria domanda, in quanto non è in realtà dipende da altri scenari che ho citato.

In ogni modo - sulla Q, non so se questo è possibile. Alla ricerca di una soluzione / soluzione.

Ho una libreria di classi, con nient'altro che POCO di:

MyCompany.MyProject.Domain.POCO

Questo ha assemblaggio a Poco in questo modo:

public class Post
{
   public int PostId { get; set; }
   public int Name { get; set; }
      ...
}

Ora, ho un'altra libreria di classi, che è il mio DAL / Repository, e utilizza Entity Framework 4.0 per la persistenza:

MyCompany.MyProject.Repositories

Questo ha assembly un riferimento al progetto POCO, come deve essere eseguire operazioni CRUD sul del POCO (afferrare oggetti DB, progetto in POCO di, ritorno, così come modificare POCO di).

Ora, ho anche un Web Application , che ha un riferimento sia al POCO and Repository assemblaggio.

Se faccio questo:

somePOCO.PostId = 10;

ho uno SQLException, come postID è un campo di identità nel database, e quindi non deve essere impostato esplicitamente.

C'è un modo per Nascondi il setter per queste proprietà speciali, in modo che solo il repository ha accesso al setter?

Non riesco a pensare ad un modo per farlo con i modificatori di accessibilità regolari (come nessuno di loro soddisfare dello scenario), si può ragazzi a pensare a una soluzione alternativa?

È stato utile?

Soluzione

si potrebbe fare il setter interno, e rendere l'interno visibile al gruppo repository

[assembly: InternalsVisibleTo("MyLibrary.Repositories")]
public class Post
{
   public int PostId { get; internal set; }
   public int Name { get; internal set; }
      ...
}

Ciò significa che tutto puo 'ottenere' tali proprietà, ma solo questa assemblea, e l'assemblea contenenti repository, puo 'set'

Altri suggerimenti

Segna tutti i setter come interno, poi aggiungere l'attributo InternalsVisibleTo ai tuoi pocos di montaggio:

 [assembly: InternalsVisibleTo( "MyCompany.MyProject.Repositories" )]  

Luke Schafer è è una buona risposta. Soddisfa il requisito tecnico della questione. Ma vorrei consigliare cautela, semplicemente perché questo non può risolvere il problema in futuro.

Non per suggerire più di ingegneria, ma forse si potrebbe desiderare di pensare astraendo ulteriormente ciò che si sta facendo con questi oggetti che hanno la proprietà ID impostabile. Essa può essere sufficiente per creare questa 'visibilita' con questa decorazione attributo, ma penso che sia una sorta di un hack per il problema. Potrebbe essere più pulito per incapsulare l'interazione tra questi oggetti con qualcos'altro, eliminando in tal modo l'accesso setter dal consumo di codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top