8

Hizmet katmanına sahip Ninject, Entity Framework ve Work of Unit desenini kullanan bir MVC3 projem var.Konu/Konularla İlgili Konular Konu/Konuyu Başlatan Özet

AsyncService sınıfım, örnek olarak Kullanıcı havuzuna kullanıcı ekleyen bir arka plan görevini başlatan bir işleve sahiptir. Geçerli sorunum, DbContext öğesinin atıldığı bir hata oluşmadan önce görevin yalnızca birkaç saniye boyunca doğru şekilde çalışmasıdır. InjectquestScope() tarafından HttpContext'e bağlandığı için, Ninject'in InRequestScope() yöntemiyle enjekte edilen veritabanı içeriğim bertaraf ediliyor gibi görünüyor.

InThreadScope() hakkında okudum, ancak MVC projemde düzgün şekilde nasıl uygulanacağından emin değilim.

Soruma Soru: Görevimde Ninject'i kullanmanın doğru yolu nedir? bu durumda kullanılamaz böylece

public class AsyncService 
{ 
    private CancellationTokenSource cancellationTokenSource; 
    private IUnitOfWork _uow; 
    public AsyncService(IUnitOfWork uow) 
    { 
     _uow = uow; 
    } 
    public void AsyncStartActivity(Activity activity) 
    { 
    ...snip... 
     this.cancellationTokenSource = new CancellationTokenSource(); 
     var cancellationToken = this.cancellationTokenSource.Token; 
     var task = Task.Factory.StartNew(() => 
      { 
       foreach (var user in activity.UserList) 
       { 
        this._uow.UserRepository.Add(new User() {UserID = user}); 
       } 
       this._uow.Save(); 
      }, cancellationToken); 
    ...snip... 
    } 
} 

cevap

5

InRequestScope d' nesneleri isteği sonunda Dispose d vardır. InThreadScope ayrıca UoW'yu çeşitli görevler için yeniden kullanacak şekilde sığmaz.

Yapabilecekleriniz, AdedScope uzantısını kullanan tüm nesneler için AsyncService Kapsam Belirleme Nesnesi olarak bildirmektir.

Bu benim ChildKernel eklentisi kullanarak daha önce kullandığınız bir dağınık bir çözümdür http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

+3

Execute() bir örnek kod var, 1 yöntemi ile bir arayüz? Jason, işe alabildiğin yer neresi? Aynı problemi yaşıyorum ve bağlantıyı takip etmek yardım etmedi. –

+0

Aynı sorunu yaşıyorum, bu senaryo için bazı örnek kodları görmek isterim. –

0

bakınız (I Named kapsamı daha temiz olur düşünüyorum). Temel olarak bir çocuk çekirdeği yaratıyorum ve UoW ile ilgili her şeyi çocuk çekirdeğinde tekil olarak ele aldım. Daha sonra, her Görev için yeni bir çocuk çekirdeği oluşturabilirim, UoW'u ele alıyorum ve geri yüklerim veya geri alma işlemi yapıyorum.

IAsyncTask

private Task void ExecuteTask<T>() where T:IAsyncTask 
{ 

     var task = Task.Factory.StartNew(() => 
              { 
      var taskKernel = _kernel.Get<ChildKernel>(); 
      var uow = taskKernel.Get<IUnitOfWork>(); 
      var asyncTask = taskKernel.Get<T>(); 

      try 
      { 
       uow.Begin(); 
       asyncTask.Execute(); 
       uow.Commit(); 
      } 
      catch (Exception ex) 
      { 
       uow.Rollback(); 
       //log it, whatever else you want to do 
      } 
      finally 
      { 
       uow.Dispose(); 
       taskKernel.Dispose(); 
      } 
     }); 
     return task; 
}