2011-02-05 21 views
12

Có ai có bất kỳ trải nghiệm nào tích hợp autofacQuartz.Net? Nếu vậy, đâu là tốt nhất để kiểm soát quản lý suốt đời - IJobFactory, trong Thi hành IJob, hoặc thông qua người nghe sự kiện?Tích hợp Autofac và Quartz.Net


Ngay bây giờ, tôi đang sử dụng một autofac tùy chỉnh IJobFactory để tạo ra các IJob trường hợp, nhưng tôi không có một cách dễ dàng để cắm vào một ILifetimeScope trong IJobFactory để đảm bảo bất kỳ tài nguyên đắt tiền được tiêm trong IJob được dọn dẹp. Nhà máy công việc chỉ tạo ra một thể hiện của một công việc và trả về nó. Dưới đây là những ý tưởng hiện tại của tôi (hy vọng có những cái tốt hơn ...)

  • Dường như hầu hết tích hợp AutoFac bằng cách nào đó quấn một ILifetimeScope xung quanh đơn vị của công việc họ tạo ra. Cách bạo lực rõ ràng dường như là để vượt qua một ILifetimeScope vào IJob và có phương pháp Execute tạo ra một đứa trẻ ILifetimeScope và khởi tạo bất kỳ phụ thuộc ở đó. Điều này có vẻ hơi quá gần với một mô hình định vị dịch vụ, do đó dường như đi ngược lại tinh thần của autofac, nhưng nó có thể là cách rõ ràng nhất để đảm bảo xử lý thích hợp một phạm vi.

  • Tôi có thể cắm vào một số sự kiện Quartz để xử lý các giai đoạn khác nhau của ngăn xếp Thực hiện công việc và xử lý quản lý lâu dài ở đó. Điều đó có lẽ sẽ có nhiều công việc hơn, nhưng có thể đáng giá nếu nó tách biệt các mối quan tâm.

  • Đảm bảo rằng IJob là một trình bao bọc đơn giản xung quanh loại IServiceComponent, sẽ thực hiện tất cả công việc và yêu cầu nó là Owned<T> hoặc Func<Owned<T>>. Tôi thích làm thế nào điều này dường như rung cảm hơn với autofac, nhưng tôi không thích rằng nó không thực thi nghiêm chỉnh cho tất cả những người triển khai IJob.

Trả lời

12

Nếu không biết quá nhiều về Quartz.Net và IJob s, tôi sẽ tiếp tục đề xuất.

Hãy xem xét các wrapper việc sau:

public class JobWrapper<T>: IJob where T:IJob 
{ 
    private Func<Owned<T>> _jobFactory; 

    public JobWrapper(Func<Owned<T>> jobFactory) 
    { 
     _jobFactory = jobFactory; 
    } 


    void IJob.Execute() 
    { 
     using (var ownedJob = _jobFactory()) 
     { 
      var theJob = ownedJob.Value; 
      theJob.Execute(); 
     } 
    } 
} 

Do đăng ký sau:

builder.RegisterGeneric(typeof(JobWrapper<>)); 
builder.RegisterType<SomeJob>(); 

Một nhà máy công việc bây giờ có thể giải quyết wrapper này:

var job = _container.Resolve<JobWrapper<SomeJob>>(); 

Lưu ý: một lifetime scope sẽ là cre như là một phần của cá thể ownedJob, trong trường hợp này là loại Owned<SomeJob>. Bất kỳ phụ thuộc nào được yêu cầu bởi SomeJobInstancePerLifetimeScope hoặc InstancePerDependency sẽ được tạo và hủy cùng với phiên bản Owned.

+0

cảm ơn bạn đã dành thời gian trả lời. Tôi thích ý tưởng ở chỗ nó là một phiên bản rõ ràng hơn về động não thứ ba của tôi trong câu hỏi ban đầu.Những gì vẫn còn lỗi tôi là tôi không kiểm soát được phạm vi cả đời. Về cơ bản, tôi muốn chạy mỗi IJob trong 'LifetimeScope' của chính nó, gần như tương đương với một cuộc gọi dịch vụ WCF. Thạch anh 'IJobFactory' không may là khá nhiều lửa và quên đi những gì tôi có thể nói, vì vậy có thể là nếu tôi thực sự muốn ranh giới phạm vi rõ ràng, tôi phải đào sâu vào hệ thống nghe Quartz. –

+0

@dfaivre - Tôi đã sửa lỗi trong mã của mình, tôi đã quên phần 'ownedJob.Value'. Có lẽ ý định của tôi rõ ràng hơn bây giờ. –

+3

Tôi không biết rằng Owned đã tạo phạm vi; rất hữu dụng. Tôi nghĩ rằng đây có lẽ là cách tiếp cận thẳng tiến nhất sau đó mà không cần phải đi sâu vào ngăn xếp Quartz. Có lẽ tôi sẽ tăng thêm 'IJobFactory' của mình để ném nếu công việc không thuộc loại 'JobWrapper <>' (chỉ vì vậy tôi ngủ ngon hơn một chút vào ban đêm ...). Cảm ơn một lần nữa vì cái nhìn sâu sắc tuyệt vời. –