UnitOfWork с репозиторием и структурой сущностей - PullRequest
0 голосов
/ 10 января 2019

Я работаю над проектом с Entity Framework, в котором я реализовал шаблон Repository и DI (Microsoft Unity), теперь для поддержки транзакций базы данных я хочу реализовать шаблон UnitOfWork, но я совершенно не уверен, как мне его реализовать в моем текущем проекте я гуглю около нескольких постов, но не могу найти ничего пригодного для моего существующего проекта.

Ниже приведена структура EF и репозитория вместе с DI (Microsoft Unity).

Сущность:

public class GenericDo 
        {
            public DateTime CreatedDate {get;set;}
            public string CreatedBy {get;set;}
        }
    public class UsersDo : GenericDo
        {
            public int UserId {get;set;}
            public string Username {get;set;}
            ....
        }
    public class UserProfileDo : GenericDo
        {
            public int Id {get;set}
            public int UserId {get;set;}
            public string Address {get;set;}
            ....
        }

Интерфейс:

public interface IGenericDao : IGenericDao<GenericDo> {}
    public interface IGenericDao<T> 
    {
        void Add(T entity);
        T Get(object Id);
        ....
    }
public interface IUsersDao : IUsersDao<UsersDo> {}
public interface IUserProfileDao : IUserProfileDao<UserProfileDo>{}

Реализация интерфейса:

public class GenericDao<T> : IGenericDao<T> where T : class
        {
            private readonly DataContext context;
            public GenericDao(DataContext _context)
            {
                this.context = _context;
            }
            public void Add(T entity)
            {
                context.Set<T>().Add(entity);
            }
            public T Get(object Id)
            {
                return context.Set<T>().Find(Id);
            }
        }
    public class UsersDao : GenericDao<UsersDo>, IUsersDao
        {
            public UsersDao(DataContext context) : base (context){}
        }
    public class UserPorfileDao : GenericDao<UserProfileDo>, IUserProfileDao
        {
            public UserPorfileDao(DataContext context) : base (context){}
        }

Настройка внедрения зависимостей в Global.asax.

var container = this.AddUnity();
    container.RegisterType<IUsersDao, UsersDao>();
    container.RegisterType<IUserProfileDao, UserProfileDao>();

Теперь на моей главной веб-странице (ASP.Net)

public partial class Default : System.Web.UI.Page
    {
        private readonly IUsersDao usersDao;
        private readonly IUserProfileDao userProfileDao;
        public Default(IUsersDao _userDao, IUserProfileDao _userProfileDao)
        {
            this.usersDao = _userDao;
            this.userProfileDao = _userProfileDao;
        }
        // Now for testing purpose, i update record.
        protected void Page_Load(object sender, EventArgs e)
        {
            UsersDo user = usersDao.Get(1);
            user.Username = "new system";

            UserProfileDo userProfile = userProfileDao.Get(1);
            userProfile.Address = "new address";

            // Now here i am confused about setting up common Save method to update database with transaction.
        }
    }

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Единица работы объединяет операции базы данных в одном объекте и отслеживает их. В Entity Framework DbContext реализует это поведение, а DbSet<> реализует хранилище. Причина, по которой люди создают свои собственные обертки, заключается в том, чтобы иметь возможность поменять Entity Framework на другой ORM, если это необходимо, или смоделировать Entity Framework для тестирования.

0 голосов
/ 10 января 2019

Шаблон UnitOfWork используется с Entity Framework.

Шаблоны хранилища и единицы работы предназначены для создания уровня абстракции между уровнем доступа к данным и уровнем бизнес-логики приложения. Реализация этих шаблонов может помочь защитить ваше приложение от изменений в хранилище данных и может облегчить автоматическое модульное тестирование или разработку через тестирование (TDD).

Первый шаг - создать репозитории. Репозиторий - это класс, который предоставляет методы для бизнес-уровня

Второй шаг: Вы можете создать реализацию UnitOfWork, как показано ниже. Есть свойства, соответствующие каждому хранилищу. Затем вы внедряете Unit of Work в свой бизнес-уровень, чтобы использовать методы репозитория.

public class UnitOfWork : IDisposable
{
    private SchoolContext context = new SchoolContext();
    private GenericRepository<Department> departmentRepository;
    private GenericRepository<Course> courseRepository;

    public GenericRepository<Department> DepartmentRepository
    {
        get
        {

            if (this.departmentRepository == null)
            {
                this.departmentRepository = new GenericRepository<Department>(context);
            }
            return departmentRepository;
        }
    }

}

см. Документацию по адресу: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

0 голосов
/ 10 января 2019

EntityFramework DbContext уже реализует Unit of Work, поэтому нет необходимости добавлять еще один уровень абстракции для реализации этого.

Можно даже сомневаться в том, что создание шаблона Repository действительно полезно, если вы используете Entity Framework. Вместо использования многоуровневой архитектуры и репозитория, вы можете выяснить, не лучше ли использовать более нарезанную архитектуру и использовать DbContext напрямую.

Кроме того, какая выгода от наличия «универсального дао», который просто делегирует вызовы Entity Frameworks DbContext? Это просто еще один уровень абстракции, который добавляет дополнительную сложность, но не дает никакой дополнительной ценности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...