15

Tôi tò mò về sự khác biệt giữa hai phương pháp này. Tôi đang triển khai mẫu trang trí bằng các hình mở và tôi có sử dụng AddAllTypesOf hoặc ConnectImplementationsToTypesClosing không, tôi có cùng chức năng.AddAllTypesOf vs ConnectImplementationsToTypesClosing

public class CommandRegistry : Registry 
    { 
     public CommandRegistry() 
     { 

      For<CommandProcessor>().Use<DefaultCommandProcessor>().Transient(); 

      Scan(scanner => 
      { 
       scanner.AssemblyContainingType<SaveCoolCommandHandler>();      

       //scanner.AddAllTypesOf(typeof(CommandHandler<>)); 
       //scanner.AddAllTypesOf(typeof(IValidator<>)); 
       //scanner.AddAllTypesOf(typeof(LogMehh<>)); 

       scanner.ConnectImplementationsToTypesClosing(typeof(CommandHandler<>)); 
       scanner.ConnectImplementationsToTypesClosing(typeof(IValidator<>)); 
       scanner.ConnectImplementationsToTypesClosing(typeof(LogMehh<>)); 
      }); 

      var handlerType = For(typeof(CommandHandler<>)); 

      handlerType.DecorateAllWith(typeof(CommandValidator<>)); //Second 
      handlerType.DecorateAllWith(typeof(CommandLogger<>)); //First 

      // ObjectFactory.WhatDoIHave(); 
     } 
    } 

Các cuộc gọi đến ObjectFactory.WhatDoIHave() cũng mang lại cho tôi những kết quả tương tự không có vấn đề phương pháp tôi chọn.

Tôi đã xem mã nguồn và các phương pháp này chắc chắn đang làm những việc khác nhau, tôi chưa thể xác định chính xác sự khác biệt là gì. Có bất kỳ hướng dẫn hoặc kịch bản nào khi người ta ưa thích hơn người kia hay không?

Trả lời

3

Lưu ý: Tôi chưa sử dụng StructureMap trong một dự án thương mại trong vài năm nay. Mọi thứ có thể đã thay đổi kể từ đó, nhưng mã ví dụ của bạn trông hoàn toàn quen thuộc nên tôi đoán nó không thay đổi nhiều.

Lý do duy nhất tôi biết nơi bạn muốn ưu tiên cái kia là khi bạn muốn xác định rõ ràng (các) quy ước sẽ được sử dụng để ánh xạ việc triển khai cụ thể cho T. Cả hai đều có thể làm được điều đó nhưng độ mạnh của việc thực hiện khác nhau.

Nếu bạn sử dụng ConnectImplementationsToTypesClosing<T>, trong khi thiết lập Scan() bạn vượt qua trong lớp hội nghị kế thừa từ IRegistrationConvention. Đối với tôi ít nhất nó chỉ làm việc mà không có bất kỳ phức tạp.

AddAllTypesOf<T> được cho là có chức năng tương tự qua ITypeScanner nhưng trong thực tế chúng tôi đã có tất cả các loại vấn đề lạ với nó như đăng ký kiểu trùng lặp, loại không nhận được đăng ký nếu trong một không gian tên khác nhau từ T, và thường không tìm thấy việc triển khai cụ thể mà họ lẽ ra đến. Những vấn đề này đều biến mất khi sử dụng ConnectImplementationsToTypesClosing<T>.

Nếu bạn không cố gắng làm bất cứ điều gì quá thông minh và các quy ước mặc định phù hợp với bạn, bạn sẽ thấy không có sự khác biệt giữa hai. Nếu bạn cần ghi đè lên các quy ước mặc định vì bất kỳ lý do nào tôi sẽ ủng hộ mạnh mẽ ConnectImplementationsToTypesClosing<T>.

+0

Câu trả lời hay, thú vị, tôi sẽ thử các kịch bản đó với các phiên bản mới hơn và xem điều gì sẽ xảy ra. – CSharper

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