2016-02-07 26 views
5

Tôi có ứng dụng wpf lớn. Tôi đơn giản hóa vấn đề của tôi với autofac. Hãy nói rằng tôi có ViewModelLocator nơi tôi tạo contrainer. ViewModelLocator nằm trong dự án Company.WPF, dự án này đề cập đến dự án Company.ViewModels.Sử dụng autofac trong nhiều giải pháp dự án

var builder = new ContainerBuilder(); 
builder.RegisterType<MainWindowViewModel>().AsSelf().SingleInstance(); 
container = builder.Build(); 

Vấn đề: MainWindowViewModel cần ICompanyService (tôi sử dụng CI) mà là ở dự án Company.Services, dự án này không phải là tài liệu tham khảo từ Company.WPF. ICompanyService là công khai và trong cùng một dự án (Company.Services) cũng đang triển khai CompanyService, nhưng nó chỉ là nội bộ.

Tôi có thể thiết lập Autofac bằng cách nào? Tôi thường sử dụng Castel Wisndor, có trình cài đặt cho những tình huống này, là tùy chọn tương tự trong Autofac quá?

Trả lời

5

Bạn đang tìm kiếm khái niệm về Modules trong autofac. Đối với mỗi lớp trong kiến ​​trúc của bạn, bạn thêm một mô-đun autofac mới cho lớp đó, nơi bạn đăng ký các loại lớp đó. Trong ViewModelLocator, nơi bạn xây dựng hộp chứa autofac, bạn chỉ cần đăng ký các mô-đun autofac thay vì đăng ký trực tiếp tất cả các loại.

Cụ thể hơn và đối với trường hợp của bạn này có thể giống như thế này:

Trong dự án Company.Services của bạn:

Bạn thêm một module mới ServicesModule với một cái gì đó như thế này. :

public class ServiceModule : Autofac.Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
    // optional: chain ServiceModule with other modules for going deeper down in the architecture: 
    // builder.RegisterModule<DataModule>(); 

    builder.RegisterType<CompanyService>().As<ICompanyService>(); 
    // ... register more services for that layer 
    } 
} 

Trong dự án Company.ViewModels của bạn:

Bạn cũng tạo ra một ViewModelModule nơi bạn đăng ký tất cả ViewModels của bạn tương tự như ServiceModule.

public class ViewModelModule : Autofac.Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
    // in your ViewModelModule we register the ServiceModule 
    // because we are dependent on that module 
    // and we do not want to register all modules in the container directly 
    builder.RegisterModule<ServiceModule>(); 

    builder.RegisterType<MainViewModel>().AsSelf().InSingletonScope(); 
    // ... register more view models 
    } 
} 

Trong dự án của bạn Company.Wpf (ViewModelLocator):

var builder = new ContainerBuilder(); 
builder.RegisterModule<ViewModelModule>(); 
builder.Build(); 

Lưu ý rằng kể từ khi chúng tôi đăng ký ServiceModule trong ViewModelModule, chúng tôi chỉ phải đăng ký ViewModelModule trực tiếp trong ContainerBuilder. Điều này có lợi thế là không cần phải thêm tham chiếu đến dự án Company.Service trong dự án Company.Wpf.

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