2011-07-08 17 views
15

Tôi có một giải pháp MVC 3 được cấu hình bằng Ninject sử dụng mẫu kho lưu trữ. Một số ràng buộc của tôi bao gồm:Định cấu hình Ninject cho ứng dụng bảng điều khiển và tận dụng kho lưu trữ hiện tại cho ứng dụng MVC của tôi

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope(); 
kernel.Bind<IMyService>().To<MyService>().InRequestScope(); 
kernel.Bind<ILogging>().To<Logging>().InSingletonScope(); 

Tôi cũng đã thêm một ứng dụng giao diện điều khiển để giải pháp của tôi và tôi muốn tận dụng kho và các dịch vụ tương tự. cấu hình Ninject của tôi cho các ứng dụng giao diện điều khiển trông giống như:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InSingletonScope(); 
kernel.Bind<IMyService>().To<MyService>().InSingletonScope(); 
kernel.Bind<ILogging>().To<Logging>().InSingletonScope(); 

console Mã của tôi trông giống như:

static void Main(string[] args) 
{ 
    IKernel kernel = new StandardKernel(new IoCMapper()); 

    var service = kernel.Get<IMyService>(); 
    var logger = kernel.Get<ILogging>(); 

    ... do some processing here 
} 

này chỉ hoạt động tốt nhưng tôi muốn t hãy chắc chắn rằng tôi cấu hình Ninject một cách chính xác cho một ứng dụng giao diện điều khiển . Có đúng khi sử dụng InSingletonScope() cho tất cả các ràng buộc của tôi trong ứng dụng giao diện điều khiển của tôi không? Tôi có nên cấu hình nó khác nhau không?

Trả lời

11

Bạn có muốn một và chỉ một phiên bản của từng dịch vụ kho lưu trữ cho toàn bộ ứng dụng không? Nếu vậy, sau đó sử dụng InSingletonScope.

Ứng dụng giao diện điều khiển của bạn có đa luồng không? Nếu đây là trường hợp và bạn muốn một thể hiện mới của các dịch vụ của bạn cho mỗi chủ đề thì bạn sẽ sử dụng InThreadScope.

Nếu bạn muốn một phiên bản mới của (các) dịch vụ mỗi khi chúng được gọi, hãy đặt nó thành InTransientScope.

Bạn cũng có tùy chọn xác định phạm vi của riêng mình bằng InScope. Bob Cravens đưa ra một cái nhìn tổng quan tốt về mỗi ứng dụng ở đây http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

+0

Ứng dụng bảng điều khiển có vòng lặp đơn giản lặp qua một vài url, xử lý nội dung, xử lý và chuyển nó đến dịch vụ để lưu nó vào cơ sở dữ liệu. Không có yêu cầu không đồng bộ vì vậy tôi giả định điều này sẽ làm cho nó đơn luồng? Cách tiếp cận nào phù hợp với kịch bản này tốt nhất? – Thomas

+0

Nếu bạn muốn sử dụng cùng một kết nối cơ sở dữ liệu mỗi lần thì bạn có thể sử dụng InSingletonScope hoặc InRequestScope. Đối với một hoạt động đồng bộ nên được tốt. Nếu vì bất kỳ lý do nào, yêu cầu của bạn đối với dịch vụ cơ sở dữ liệu trở nên không đồng bộ (thường xảy ra trong các kịch bản UoW) thì bạn có thể bắt đầu chạy vào các vấn đề với kết nối cơ sở dữ liệu đang được sử dụng bởi hai cuộc gọi khác nhau cùng một lúc. Điều này đã xảy ra với tôi vài tháng trước và tôi dành hàng ngày cố gắng tìm ra những gì đang diễn ra –

+0

Khi bạn nói "yêu cầu của bạn đối với dịch vụ cơ sở dữ liệu trở nên không đồng bộ" Tôi giả sử tôi thực sự phải sửa đổi mã của mình thành "không đồng bộ" hoặc cái gì đó có thể xảy ra "dưới mui xe"? – Thomas

Các vấn đề liên quan