Bij een website waar ik op het moment mee bezig ben probeer ik ervoor te zorgen dat in mijn interface laag geen data veranderd kan worden in de entities, waardes ophalen moet natuurlijk wel kunnen, dus als we b.v. een entity user hebben dan:
Mag dit wel
Response.Write(user.Name); // Get
Mag dit niet
User.Name = “Piet”; // Set
Om dit voor elkaar te krijgen dacht ik aan het gebruiken van interfaces, de interface is public en de daadwerkelijke entity blijft private. In de interfaces zet ik dan alleen getters en in de entity zelf voeg ik de setters toe. Op deze manier moet de entity naar de domain laag gestuurd worden om hem te kunnen updaten.
Het leek te werken totdat ik het ging gebruiken met NHibernate, die zegt namelijk bij elke “many to one” relatie dat hij geen toegang heeft tot het type waar naar verwezen wordt in de relatie.
Dit is mijn code:
De interfaces
Zoals je kan zien zijn in de interfaces geen setters te vinden, Theme in IUser is de relatie waarop het fout gaat.
De interface implementaties
Zoals je kan zien worden hier pas de setters toegvoegd.
Service class
Hier gaat het fout op regel 10.
De mapping files zijn goed daar ben ik 100% zeker van, als ik de entity Theme (niet de interface) public maak in plaats van internal werkt het zonder problemen alleen dan kan ik die class benaderen vanuit me interface.
Weet iemand een andere manier om dit voor elkaar te krijgen of nog beter hoe ik dit kan laten werken met nhibernate?
Mag dit wel
Response.Write(user.Name); // Get
Mag dit niet
User.Name = “Piet”; // Set
Om dit voor elkaar te krijgen dacht ik aan het gebruiken van interfaces, de interface is public en de daadwerkelijke entity blijft private. In de interfaces zet ik dan alleen getters en in de entity zelf voeg ik de setters toe. Op deze manier moet de entity naar de domain laag gestuurd worden om hem te kunnen updaten.
Het leek te werken totdat ik het ging gebruiken met NHibernate, die zegt namelijk bij elke “many to one” relatie dat hij geen toegang heeft tot het type waar naar verwezen wordt in de relatie.
code:
1
2
3
4
| Access is denied: 'Domain.Test.Theme'. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.TypeLoadException: Access is denied: 'Domain.Test.Theme'. |
Dit is mijn code:
De interfaces
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| namespace Domain.Test { public interface IUser { int Id { get; } string Name { get; } ITheme Theme { get; } } public interface ITheme { int Id { get; } string Name { get; } } } |
Zoals je kan zien zijn in de interfaces geen setters te vinden, Theme in IUser is de relatie waarop het fout gaat.
De interface implementaties
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| namespace Domain.Test { class User : IUser { private int id; private string name; private ITheme theme; public int Id { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } public ITheme Theme { get { return theme; } set { theme = value; } } } class Theme : ITheme { private int id; private string name; public int Id { get { return id; } set { id = value; } } public string Name { get { return name; } set { name = value; } } } } |
Zoals je kan zien worden hier pas de setters toegvoegd.
Service class
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| using NHibernate; namespace Domain.Test { public static class Service { public static IUser GetById(int userId) { ISession session = NHibernateHelper.Instance.CurrentSession; return session.Get<User>(userId); } } } |
Hier gaat het fout op regel 10.
De mapping files zijn goed daar ben ik 100% zeker van, als ik de entity Theme (niet de interface) public maak in plaats van internal werkt het zonder problemen alleen dan kan ik die class benaderen vanuit me interface.
Weet iemand een andere manier om dit voor elkaar te krijgen of nog beter hoe ik dit kan laten werken met nhibernate?