2013-04-28 3 views
0

У меня возникают проблемы с моими транзакциями в том, что они перерастают в распределенную транзакцию, чего я не хочу. Из того, что я читал, это вызвано открытием нескольких соединений во время транзакции. Чтобы исправить это, я перерабатываю свой код, чтобы иметь возможность создать один dbContext и передать его всем классам, поэтому у меня есть только один контекст и, следовательно, одно соединение во время транзакции.Как передать экземпляр класса в конструктор базового класса

Мой вопрос: как создать один экземпляр контекста и передать его базовому классу. То, что я написал, это то, что я пытаюсь сделать в концепции, но, очевидно, это не сработает. Как я могу это достичь?

private WorkOrderHeaderRepository _workOrderHeaderRepository; 
    private WorkOrderDetailRepository _workOrderDetailRepository; 
    private InventoryMgmtContext _dbContext; 

    #region Constructors 

    public ManageWorkOrdersAppServ() 
     : base(new WorkOrderHeaderRepository(_dbContext)) <----How pass _dbContext to base here 
    { 
     _dbContext = new InventoryMgmtContext(); 
     _workOrderHeaderRepository = new WorkOrderHeaderRepository(_dbContext); 
     _workOrderDetailRepository = new WorkOrderDetailRepository(_dbContext); 

    } 
+0

Даже если это сработало, а это не так, вы бы передали нулевую ссылку *. Вы еще не инициализировали поле. –

ответ

3

Трудно сказать, что правильная вещь, чтобы сделать здесь, но это звучит, как вы хотите контекст быть статическое поле, а не поле экземпляра.

private static InventoryMgmtContext _dbContext = new InventoryMgmtContext(); 
public ManageWorkOrdersAppServ() 
    : base(new WorkOrderHeaderRepository(_dbContext)) 
{ 
    _workOrderHeaderRepository = new WorkOrderHeaderRepository(_dbContext); 
    _workOrderDetailRepository = new WorkOrderDetailRepository(_dbContext); 

} 

Да?

Недостатком здесь является то, что контекст остается живым навсегда, что может и не быть тем, что вы хотите. Если это не то, что вы хотите, то подтолкнуть проблему прочь к вызывающему:

public ManageWorkOrdersAppServ(Context dbContext) 
    : base(new WorkOrderHeaderRepository(dbContext)) 
{ 
    _workOrderHeaderRepository = new WorkOrderHeaderRepository(_dbContext); 
    _workOrderDetailRepository = new WorkOrderDetailRepository(_dbContext); 

} 

сделать вызывающий пройти в соответствующий контекст и сделать их управлять своим созданием.

Кроме того, хотя мы критикуем этот код: .NET stl gdlns frwn on abrvs in nms, thyr hrd 2 rd. Думаю, вы хотели сказать InventoryManagementContext.

+0

Эрик, я ценю ответ. Как вы скажете по моему следующему вопросу, я новичок в разработке C#, и я «учился на дому». Итак, что вы имеете в виду, что он останется в живых навсегда? Второй метод - это то, что я делаю сейчас. Мне просто не нравится мысль создать контекст на уровне контроллера и пыталась сохранить его на уровне серверов. –

+0

А, нет, я не хочу, чтобы dbContext длился так долго. Мне нужно немного реорганизовать мой код. Благодарю. –

Смежные вопросы