5

trường hợp của tôi nó là Ninject 2.Làm cách nào để quản lý việc xử lý đối tượng khi tôi sử dụng IoC?

// normal explicit dispose 
using (var dc = new EFContext) 
{ 
} 

Nhưng đôi khi tôi cần phải tiếp tục bối cảnh dài hơn hoặc giữa các cuộc gọi chức năng. Vì vậy, tôi muốn kiểm soát hành vi này thông qua phạm vi IoC.

// if i use this way. how do i make sure object is disposed. 
var dc = ninject.Get<IContext>() 

// i cannot use this since the scope can change to singleton. right ?? 
using (var dc = ninject.Get<IContext>()) 
{ 
} 

mẫu scopes

Container.Bind<IContext>().To<EFContext>().InSingletonScope(); 
// OR 
Container.Bind<IContext>().To<EFContext>().InRequestScope(); 
+0

trùng lặp: http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc – TrueWill

+0

Cảm ơn bạn đã liên kết – Aval

Trả lời

3

Từ những gì tôi biết (Tôi đã làm một nghiên cứu khoảng một tháng trước) Ninject không hỗ trợ quản lý vòng đời nào cả. Castle Windsor và AutoFac (và ở một mức độ nào đó StructureMap, nhưng chỉ khi sử dụng các thùng chứa lồng nhau) sẽ xử lý việc xử lý các thành phần dùng một lần mà chúng tạo ra vào thời điểm thích hợp.

1

Nếu bạn có kiểm soát đối với Giao diện IContext, add IDisposable trong danh sách giao diện từ đó của nó kế thừa. Nếu không, downCast các IContext bạn nhận được để một IDisposable ...

var context = ninject.Get<IContext>(); 

using ((IDisposable)context) 
{ 
} 

Bạn cũng có tùy chọn thay đổi giao diện của IContext để làm điều này bằng cách tổng hợp, nếu bạn kiểm soát IContext ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

var context = ninject.Get<IContext>(); 

using (context.GetUsageHandle()) 
{ 
} 
+0

nhờ. nếu tôi thay đổi phạm vi của mình thành singleton trong trường hợp trên thì sao? Nó vứt bỏ. đúng, lần sau tôi gọi hàm đó, bạn sẽ nhận được ngoại lệ. – Aval

+0

@Aval: Đúng, đó là lý do tại sao bạn muốn sử dụng triển khai thứ hai, trong đó ngữ cảnh tạo ra thứ gì đó là _not_ một Singleton dùng một lần. Tốt hơn, vẫn còn, bạn có thể bắt đầu bằng việc thực hiện lần thứ hai chỉ trả lại đối tượng dùng một lần và sau đó thay đổi để có một singleton với flyweights dùng một lần mà không ảnh hưởng đến khách hàng. –

+0

cảm ơn, nó thực sự đã giúp tôi. – Aval

1

Ngoài các phạm vi tiêu chuẩn của Tạm thời, OnePerThread và Singleton, bạn có thể sử dụng ActivationBlock để kiểm soát tuổi thọ của toàn bộ các đối tượng. Khi khối được xử lý, tất cả các đối tượng được lấy ra bởi các khối đi ra khỏi phạm vi - vì vậy singletons và những người khác được xử lý khi các trường hợp của họ được yêu cầu bởi khối kích hoạt.

var kernel = new StandardKernel(); 
kernel.Bind<NotifiesWhenDisposed>().ToSelf(); 

NotifiesWhenDisposed instance = null; 
using(var block = new ActivationBlock(kernel)) 
{ 
    instance = block.Get<NotifiesWhenDisposed>(); 
    instance.IsDisposed.ShouldBeFalse(); 
} 

instance.IsDisposed.ShouldBeTrue(); 
Các vấn đề liên quan