10

Tôi có thực hiện như sau:Làm thế nào để sử dụng Autofac trong một dự án thư viện lớp học?

private INewsRepository newsRepository; 

public NewsService(INewsRepository newsRepository) 
{ 
    this.newsRepository = newsRepository; 
} 

Dịch vụ này trong một dự án riêng biệt so với các dự án web của tôi. Ở đâu và làm thế nào tôi sẽ chỉ định tiêm phụ thuộc? Tôi vẫn cần phải đặt nó trong tập tin global.asax của tôi? Điều gì xảy ra nếu dịch vụ này cũng được sử dụng cho các ứng dụng khác của tôi?

Trả lời

18

bạn chỉ nên tham khảo các container từ thư mục gốc của ứng dụng (global.asax), được gọi là Register Resolve Release pattern.

Sử dụng chính xác Việc xây dựng Injection đảm bảo rằng bạn có thể sử dụng lại lớp NewsService từ các ứng dụng khác mà không yêu cầu những ứng dụng khác sử dụng DI Container cụ thể (hoặc bất kỳ).

Đây là một khởi đầu tốt tại designing the service in a DI Friendly manner, nhưng vẫn giữ nó thuyết bất khả tri.

2

Tôi đoán nó sẽ phụ thuộc vào việc bạn định sử dụng cùng một cụm trong nhiều ứng dụng máy chủ. Liệu các hội đồng thực sự yêu cầu tài liệu tham khảo để AutoFac? Tôi sẽ khuyên bạn nên chống lại điều này, như thể yêu cầu của bạn thay đổi sau đó bạn sẽ có một tải tài liệu tham khảo không cần thiết. Ứng dụng máy chủ của bạn nên kiểm soát cách lắp ráp các bộ phận mô-đun, vì vậy tôi sẽ để lại cấu hình cho máy chủ của bạn (trong trường hợp này là ứng dụng web của bạn). , nhưng như tôi đã đề cập trước đây, lắp ráp của bạn được về cơ bản chắc chắn sẽ sử dụng AutoFac ví dụ:

public static class NewsRegistration() 
{ 
    public static void RegisterTypes(ContainerBuilder builder) 
    { 
     // Register your specific types here. 
     builder.RegisterType<NewsService>().As<INewsService>(); 
    } 
} 

bằng cách đó bạn có thể dễ dàng gọi:

var builder = new ContainerBuilder(); 
// Register common types here? 

NewsRegistration.RegisterTypes(builder); 

var container = builder.Build(); 
2
[TestClass] 
public class LogTest 
{ 
    /// <summary> 
    /// Test project: autofac impl. 
    /// </summary> 
    private readonly ContainerBuilder _builder; 
    private readonly IContainer _container; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="LogTest" /> class. 
    /// </summary> 
    public LogTest() 
    { 
     // 
     // Read autofac setup from the project we are testing 
     // 
     _builder = new ContainerBuilder(); 
     Register.RegisterTypes(_builder); 
     _container = _builder.Build(); 

     loggingService = _container.Resolve<ILoggingService>(new NamedParameter("theType", this)); 
    } 

    [TestMethod] 
    public void DebugMsgNoExectption() 
    { 
     var a = _container.Resolve<IHurraService>(); 
     var b = a.ItsMyBirthday(); 

public class HurraService : IHurraService 
{ 
    private IHurraClass _hurra; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="HurraService" /> class. 
    /// </summary> 
    public HurraService(IHurraClass hurra) 
    { 
     _hurra = hurra; 
    } 

    /// <summary> 
    /// It my birthday. 
    /// </summary> 
    public string ItsMyBirthday() 
    { 
     return _hurra.Hurra(); 
    } 
} 

public static class Register 
{ 
    public static void RegisterTypes(ContainerBuilder builder) 
    { 
     builder.RegisterType<LoggingService>().As<ILoggingService>(); 
     builder.RegisterType<HurraService>().As<IHurraService>(); 
     builder.RegisterType<HurraClass>().As<IHurraClass>(); 
    } 
} 

Bên trong thư viện lớp Tôi đã tạo lớp "Đăng ký". Ở đây thiết lập Autofac được thực hiện. Trong dự án thử nghiệm của tôi, tôi đọc tệp này (Register.RegisterTypes) và khởi tạo _container.

Bây giờ tôi có quyền truy cập để Giải quyết tất cả các tính năng trong dự án mà tôi đang thử nghiệm.

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