Добрый день!
Возник вопрос, как лучше организовать DAL (Data access layer). Речь идет не о бизнес-логике, а именно об уровне доступа к данным.
Пусть у нас есть следующие объекты:
1. Компьютер. У него есть ID, имя и список пользователей.
2. Пользователь. У него есть ID и имя.
Рассматриваю 2 варианта:
interface IDB : IDisposable
{
public IComputersCollection Computers {get;}
void Commit();
}
interface IComputersCollection
{
IComputer Create();
void Add(IComputer);
void Remove(Guid);
IComputer Get(Guid);
IEnumerable<IComputer> GetAll();
}
interface IComputer
{
Guid Id {get;}
string Name {get;set;}
IUsersCollection Users {get;}
]
interface IUsersCollection
{
IUser Create();
void Add(IUser);
void Remove(Guid);
IUserGet(Guid);
IEnumerable<IUser> GetAll();
}
interface IUser
{
Guid Id {get;}
string Name {get;set;}
IComputer Computer { get;}
}
Т.е., в этом случае DAL повторяет не структуру базы, а структуру предметной области.
2.
interface IDB : IDisposable
{
public IComputersCollection Computers {get;}
public IUsersCollection Users {get;}
public IUserToComputerCollection UsersToComputers {get;}
void Commit();
}
interface IComputersCollection
{
IComputer Create();
void Add(IComputer);
void Remove(Guid);
IComputer Get(Guid);
IEnumerable<IComputer> GetAll();
}
interface IComputer
{
Guid Id {get;}
string Name {get;set;}
]
interface IUsersCollection
{
IUser Create();
void Add(IUser);
void Remove(Guid);
IUserGet(Guid);
IEnumerable<IUser> GetAll();
}
interface IUser
{
Guid Id {get;}
string Name {get;set;}
}
interface IUserToComputerCollection
{
IUserToComputer Create();
void Add(IUserToComputer );
void Remove(Guid);
IUserToComputer Get(Guid);
IEnumerable<IUserToComputer > GetAll();
}
interface IUserToComputer
{
Guid Id {get;}
Guid UserId {get;set;}
Guid ComputerId {get;set;}
}
Т.е. в этом случае DAL повторяет структуру базы.
Естественно, поверх DAL будет бизнес логика. И она будет предоставлять интерфейсы из варианта 1. Но вот как организовать DAL?
Заранее спасибо.