Gebruik van Subsonic bij strikte scheiding van lagen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online
Ik ben op dit moment een ASP.NET website aan het bouwen en ik wil deze netjes in lagen opdelen. Ik maak op dit moment gebruik van een presentatie laag, service laag en een dataaccess laag.

Voor het genereren van de Dal maak ik gebruik van subsonic. Subsonic maakt gebruik van het active record pattern en daarom zitten er in de business objecten functies als bijv. save en delete. Ook bevinden deze business objecten zicht noodgedwongen in de dataaccess laag. Ik wil echter wel voorkomen dat een programmeur in de presentatie laag Object.Save kan doen. Mijn idee is nu om een eigen business laag in te bouwen met business objecten met hierin alleen properties. En deze objecten door te gaan geven vanuit de dataaccess laag. Subsonic faciliteert dit op zich ook door de methode ExecuteTypedList<T>().

Mijn vraag komt eigenlijk neer op: Is dit een acceptabele manier van werken of moet ik gewoon de right tool for the right job gebruiken en gaan voor nhibernate (wat ik liever niet wil omdat ik dit wel heel makkelijk vind werken). Aan de andere kant wil ik subsonic ook weer niet op een heel ongebruikelijke manier implementeren. Kortom, even klankborden :)

Onderstaande repository bevind zich dan in de dataaccess laag en mapt dan min of meer tussen subsonic objecten en mijn eigen business objecten.

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
using System;
using System.Collections.Generic;
using System.Text;

using TestWeb.DataAccess.Interfaces;
using TestWeb.DataAccess.Data.Sub.Generated;

namespace TestWeb.DataAccess.Data.Sub
{
    public class SubSonicEmployeeReposistory : IEmployeeRepository
    {
        public IList<TestWeb.Business.Models.Employee> GetEmployees()
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public IList<TestWeb.Business.Models.Employee> GetEmployeesByGender(string gender)
        {
            return DB.
                   Select("EmployeeKey", "FirstName").
                   From<DimEmployee>().
                   Where(DimEmployee.Columns.Gender).IsEqualTo(gender).
                   OrderAsc("FirstName").
                   ExecuteTypedList<TestWeb.Business.Models.Employee>();
        }

        public TestWeb.Business.Models.Employee SaveEmployee(TestWeb.Business.Models.Employee employee)
        {
            DimEmployee emp = new DimEmployee();
            emp.FirstName = employee.FirstName;
            emp.Save();
            employee.EmployeeKey = emp.EmployeeKey;
            return employee;
        }
    }
}


Ik weet trouwens dat je met subsonic ook repositories kunt genereren maar dan kan je nog steeds vanuit elke laag waar je je business objecten gebruikt database functionaliteit aanroepen.

[ Voor 0% gewijzigd door Brakkie op 16-01-2009 16:12 . Reden: typfout ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Dan ben je eigenlijk met het verkeerde design pattern (ACTIVE record) aan de gang gegaan. De proxy welke gegenereerd zal worden voor je entity zal deze ook business logica krijgen.

Andere 'DAL' frameworks zoals NHibernate gebruiken persistent objects. Via een proxy wordt je entity gevuld aan de hand van een mapping. Om je entity naar de database weg te schrijven zul je dan een sessie moeten starten en deze sessie bevat de functionalteit voor het opslaan van je entity.

Omdat entities vaak ook via WebServices wordt verspreid wil je eigenlijk alleen met 'data holder' objecten communiceren.

Persoonlijk ken ik Sonic niet, maar heb wel eens een test gedaan met Castle's ActiveRecord, maar dat beviel niet echt. Als liever met attributen werkt dan mapping bestanden, dan kun je ook NHIbernate attributes gebruiken..

If it isn't broken, fix it until it is..