2012-08-27 34 views
5

Tôi đang tạo một trang web bằng cách sử dụng Orchard CMS và tôi có một dự án .NET bên ngoài được viết với Ninject để tiêm phụ thuộc mà tôi muốn sử dụng cùng với một mô-đun trong Orchard CMS. Tôi biết rằng Orchard sử dụng Autofac để tiêm phụ thuộc và điều này gây ra cho tôi những vấn đề vì tôi chưa bao giờ làm việc với DI trước đây.Tôi có thể sử dụng dự án Ninject .NET của mình trong Orchard CMS không?

Tôi đã tạo ra một mô-đun Autofac, UserModule, mà đăng ký các nguồn, UserRegistrationSource, như thế này:

UserModule.cs

public class UserModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterSource(new UserRegistrationSource()); 
    } 
} 

UserRegistrationSource.cs

public class UserRegistrationSource : IRegistrationSource 
{ 
    public bool IsAdapterForIndividualComponents 
    { 
     get { return false; } 
    } 

    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor) 
    { 
     var serviceWithType = service as IServiceWithType; 
     if (serviceWithType == null) 
      yield break; 

     var serviceType = serviceWithType.ServiceType; 
     if (!serviceType.IsInterface || !typeof(IUserServices).IsAssignableFrom(serviceType) || serviceType != typeof(IUserServices)) 
      yield break; 

     var registrationBuilder = // something... 

     yield return registrationBuilder.CreateRegistration(); 
    } 
} 

UserServices.cs

public interface IUserServices : IDependency 
{ 
    void Add(string email, string password); 
} 

public class UserServices : IUserServices 
{ 
    private readonly EFMembershipManager _manager; 

    public UserServices(EFMembershipManager manager) 
    { 
     _manager = manager; 
    } 

    public void Add(string email, string password) 
    { 
     _manager.createUser(email, password); 
    } 
} 

EFMembershipManager.cs constructor

public EFMembershipManager(ServerRepository db, 
          ServerRepositoryMembershipProvider membershipProvider, 
          string testUsername, 
          string serverUsername) 
{ 
... 
} 

EFMembershipManager là một lớp học từ dự án bên ngoài trong đó sử dụng Ninject cho DI và sử dụng ServerRepositoryServerRepositoryMembershipProvider ai cũng được tiêm sử dụng Ninject.

Và bây giờ tôi đang mắc kẹt ...

nên UserRegistrationSource mất container Ninject (kernel) như một đối số nhà xây dựng và cố gắng tìm ra dịch vụ IUserServices và sau đó hòa giải giải quyết để kernel Ninject và trả về một sản phẩm nào Có thể đếm được để Autofac không cố gắng giải quyết bất kỳ điều gì liên quan đến IUserServices hoặc đây có phải là cách tiếp cận sai không?

+1

Bạn có thể giải thích lý do tại sao cần viết lại không? Dường như với tôi chỉ có những gì mã nhỏ đang đối phó với tiêm sẽ cần phải được sửa đổi. Bạn đề cập đến vấn đề. Họ đặc biệt là gì? –

+1

@BertrandLeRoy Việc viết lại xuất phát từ thực tế là dự án bên ngoài có rất nhiều tiêm phụ thuộc và tham chiếu đến các dự án khác cũng sử dụng Ninject để tiêm phụ thuộc. Vì vậy, sẽ có rất nhiều sửa đổi để có được tất cả mọi thứ để làm việc. Vấn đề tôi phải đối mặt chỉ đơn giản là làm thế nào tôi có thể tham khảo các dự án bên ngoài trong mô-đun Orchard của tôi mà không cần phải chuyển đổi tất cả các tiêm Ninject để tiêm Autofac. Nếu điều đó thậm chí có thể. – Mattias

+0

Tôi không nghĩ rằng có một cách khác hoặc nếu bạn sẽ có thể thực hiện công việc này. Có thể tốt hơn để giữ cho dự án bên ngoài đó bên ngoài. –

Trả lời

4

Tự động hỗ trợ registration sources (và nhiều hơn nữa trên nguồn đăng ký here). Nguồn đăng ký là dịch vụ mà vùng chứa sẽ tham khảo khi cố gắng giải quyết loại. Các nguồn có thể đáp ứng, hoặc với một phương tiện để xây dựng các loại, hoặc một danh sách sản phẩm nào mà chỉ ra rằng nguồn là không thể cung cấp các loại yêu cầu.

Trong trường hợp của bạn, nguồn đăng ký có thể được triển khai để cố gắng giải quyết loại được yêu cầu từ vùng chứa Ninject của bạn.

Tôi không quá quen thuộc với Orchard nhưng tôi đoán rằng nó sử dụng tệp cấu hình để định cấu hình Autofac. Đề xuất của tôi là bạn tạo a simple Autofac module đăng ký triển khai nguồn đăng ký của bạn và bạn định cấu hình Orchard thành load the module from config.

+0

Được rồi, câu trả lời hay. Nếu nguồn đăng ký xác định dịch vụ được kết nối với dự án bên ngoài, 'IUserServices', và hướng dẫn thùng chứa Ninject (hạt nhân) giải quyết nó và trả về một số đếm trống để cho Autofac không giải quyết các loại được yêu cầu hoặc đây có phải là cách tiếp cận sai lầm không? – Mattias

+0

Ý tưởng của tôi là, vì nó sẽ là Autofac thực hiện yêu cầu ban đầu cho các dịch vụ, nguồn sẽ được "hỏi" nếu nó hỗ trợ 'IUserServices' (và mọi dịch vụ khác cho vấn đề đó). Sau đó, nó sẽ cố gắng giải quyết dịch vụ đó từ Ninject. Nếu Ninject chứa dịch vụ, bạn có thể trả về cá thể từ nguồn. Nếu không, nguồn sẽ trả về trống. –

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