Usually I create a service level in my application for processing business logic, which negotiates with my level of data access to save any data.
public class JobService : IJobService
{
private readonly IJobRepository _jobRepository;
public JobService(IJobRepository jobRepository)
{
_jobRepository = jobRepository;
}
public IEnumerable<Job> GetAllJobs()
{
return _jobRepository.All().OrderBy(x => x.Name);
}
public Job GetJobById(Guid Id)
{
return _jobRepository.FindBy(x => x.Id == Id);
}
public void UpdateJob(Job job, User user)
{
job.LastUpdatedDate = DateTime.Now;
job.LastUpdatedBy = user;
_jobRepository.Update(job);
}
public void DeleteJob(Job job)
{
_jobRepository.Delete(job);
}
public void SaveJob(Job job, User user)
{
job.CreatedDate = DateTime.Now;
job.CreatedBy = user;
_jobRepository.Insert(job);
}
}
, , . POCO, POCO. -. , , .
, , . , , , -, , . , EF, , NHibernate. , , , .
:
public interface IRepository<TKey, TEntity> : IRepository where TEntity : class, IEntity<TKey>
{
TEntity Insert(TEntity entity);
IEnumerable<TEntity> Insert(IEnumerable<TEntity> entities);
TEntity Update(TEntity entity);
TEntity SaveOrUpdate(TEntity entity);
bool Delete(TKey id);
bool Delete(TEntity entity);
bool Delete(IEnumerable<TEntity> entities);
IQueryable<TEntity> All();
TEntity FindBy(Expression<Func<TEntity, bool>> expression);
IQueryable<TEntity> FilterBy(Expression<Func<TEntity, bool>> expression);
TEntity FindBy(TKey id);
}
IJobRepository:
// We create separate repositories inheriting from IRepository in case we need specific repository methods for that entity
public interface IJobRepository : IRepository<Guid, Job>
{
}
, , , , EF DbSet DbContext .
-. , . // ..
, Inversion of Control (IoC) . Castle Windsor, IoC.