Контекст одноэлементного объекта с использованием Unity IoC в окне создает проблему транзакций всего приложения и базы данных - PullRequest
0 голосов
/ 01 января 2019

Я использую Unity IoC в C # и DbContext с ContainerControlledLifetimeManager для контекста приложения с трехуровневой архитектурой, использующей структуру сущностей, например,

Это общий репозиторий:

public interface IRepository<ModelClass, EntityClass>
    where ModelClass : class
    where EntityClass : class
{
    void Add(ModelClass entity);
    void Delete(ModelClass entity);
    void Update(ModelClass entity,int id);
    bool Save();
    void RefreshContext();
}

Этоинтерфейс уровня доступа к данным:

public interface IShipmentAccess :
    IRepository<ShipmentOrder, ShipmentOrderEntity>
{
    List<ShipmentOrder> GetAllShipmentOrder();
    List<ShipmentOrder> GetShipmentOrderWithId(int id);
    bool UpdateFileExported(int id);
}

Реализация класса DataAcess

public class ShipmentOrderDataAccess : GenericRepository<ShipmentOrder,
    ShipmentOrderEntity>, IShipmentAccess
{
    ApplicationContext context;
    public ShipmentOrderDataAccess(ApplicationContext context)
        : base(context)
    {
        this.context = context;
    }
}

Реализация класса обслуживания

public class ShipmentOrderService : BaseService
{
    ApplicationContext Context;

    IShipmentAccess shipmentAccess;
    PackingOrderService packingOrderService =
        DependencyInjection.DependencyInjection.Retrieve<PackingOrderService>();

    public ShipmentOrderService(ApplicationContext Context, IShipmentAccess
        shipmentAccess)
    {
        this.Context = Context;
        this.shipmentAccess = shipmentAccess;
    }
}

А наш класс внедрения зависимостей выглядит следующим образом:

Container.RegisterType<DbContext, LogisticsERP.DA.Entities.ApplicationContext>(
    new ContainerControlledLifetimeManager());

Container.RegisterType<IShipmentAccess, ShipmentOrderDataAccess>();

Но проблема здесь в том, что, хотя мы используем одноэлементный менеджер времени жизни (ContainerControlledLifetimeManager) из Unity и Entity Framework, он не загружает обновленные данные из базы данных.Я ищу в Интернете и нашел это решение, чтобы получить обновленные данные из базы данных.Это правильное решение?

public void RefreshContext()
{
    foreach (var entity in context.ChangeTracker.Entries())
    {
        entity.Reload();
    }
}
...