Accesso ai membri internal.

Per chi come me fa uso di NHibernate per la parte di persistenza saprà sicuramente che è necessario impostare le proprietà delle nostre entities come virtual. Questo è necessario in quanto NHibernate per poter sfruttare a pieno le sue potenzialità, come LazyLoad, crea un’istanza di un proxy (con DynamicProxy di Castle) ed inietta a runtime la logica da noi richiestra tramite mapping, fetching, ecc.

Ora se il nostro strato di accesso ai dati non restituisce la entity di dominio, bensì un DTO (Data Transfer Object, ne abbiamo parlato qui)  vorrei che il progetto che referenzierà il nostro Data Layer non possa creare un’istanza della entity di dominio; per far questo ci basta specificare che la entity di dominio sia di tipo internal.

Questo va si a risolvere il nostro problema, ma impedisce all’assembly di NHibernate di accedere alle entities di dominio in quanto questo si trova a sua volta in un’assembly esterna, sollevando una bella Castle.DynamicProxy.Generators.GeneratorException, come quella mostrata qui di seguito:

Type is not public, so a proxy cannot be generated. Type: imperugo.example.domain.entitybase

Castle.DynamicProxy.Generators.GeneratorException: Type is not public, so a proxy cannot be generated. Type : imperugo.example.domain.entitybase

Per ovviare a questo problema e permettere solo al proxy di Castle di poter accedere all nostra assembly ci basta modificare il file AssemblyInfo aggiungendo la seguente riga:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

A questo punto tutto dovrebbe essere ok, il Data Layer non ha esposto esternamente il dominio ed NHibernate riesce a creare i suoi proxy.
Ciauz


Comments