Nếu bạn không biết những gì tôi đang nói về hoặc đi qua the tutorial và cố gắng để thêm phụ thuộc Tiêm chính mình hoặc thử vận may của bạn với lời giải thích của tôi về vấn đề này.Có cách nào tốt/thích hợp để giải quyết vấn đề vòng lặp tiêm phụ thuộc trong hướng dẫn ASP.NET MVC ContactsManager không?
Lưu ý: Vấn đề này không nằm trong phạm vi của hướng dẫn ban đầu trên ASP.NET. Hướng dẫn này chỉ gợi ý rằng các mẫu được sử dụng là tiêm thân thiện với phụ thuộc.
Vấn đề về cơ bản là có một vòng lặp phụ thuộc giữa Bộ điều khiển, ModelStateWrapper và ContactManagerService.
- Hằng số ContactController mất một IContactManagerService.
- Trình tạo ContactManagerService mất một IContactManagerRepository (không quan trọng) và IValidationDictionary (mà ModelStateWrapper thực hiện).
- Phương thức khởi tạo ModelStateWrapper lấy ModelStateDictionary (thuộc tính được gọi là "ModelState" trên bộ điều khiển).
Vì vậy, chu kỳ phụ thuộc đi như thế này: Bộ điều khiển> Dịch vụ> ModelStateWrapper> Bộ điều khiển
Nếu bạn cố gắng thêm dependency injection để này, nó sẽ thất bại. Vì vậy, câu hỏi của tôi là; Tôi nên làm gì với nó? Những người khác đã đăng câu hỏi này, nhưng câu trả lời rất ít, khác nhau, và tất cả dường như kinda "hack-ish".
giải pháp hiện tại của tôi là để loại bỏ các IModelStateWrapper từ các nhà xây dựng IService và thêm một phương pháp Initialize thay vì như thế này:
public class ContactController : Controller
{
private readonly IContactService _contactService;
public ContactController(IContactService contactService)
{
_contactService = contactService;
contactService.Initialize(new ModelStateWrapper(ModelState));
}
//Class implementation...
}
public class ContactService : IContactService
{
private IValidationDictionary _validationDictionary;
private readonly IContactRepository _contactRepository;
public ContactService(IContactRepository contactRepository)
{
_contactRepository = contactRepository;
}
private void Initialize(IValidationDictionary validationDictionary)
{
if(validationDictionary == null)
throw new ArgumentNullException("validationDictionary");
_validationDictionary = validationDictionary;
}
//Class implementation...
}
public class ModelStateWrapper : IValidationDictionary
{
private readonly ModelStateDictionary _modelState;
public ModelStateWrapper(ModelStateDictionary modelState)
{
_modelState = modelState;
}
//Class implementation...
}
Với cấu trúc này, tôi có thể cấu hình chứa sự hiệp nhất của tôi như thế này:
public static void ConfigureUnityContainer()
{
IUnityContainer container = new UnityContainer();
// Registrations
container.RegisterTypeInHttpRequestLifetime<IContactRepository, EntityContactRepository>();
container.RegisterTypeInHttpRequestLifetime<IContactService, ContactService>();
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
}
Thật không may điều này có nghĩa là phương thức "Khởi tạo" trên dịch vụ phải được gọi là theo cách thủ công bởi trình tạo bộ điều khiển. Có cách nào tốt hơn? Có lẽ tôi bằng cách nào đó bao gồm IValidationDictionary trong cấu hình thống nhất của tôi? Tôi có nên chuyển sang một thùng chứa DI khác không? Tui bỏ lỡ điều gì vậy?
Tôi phải thừa nhận tôi đã thực hiện hướng dẫn này 3 lần và chưa bao giờ đi qua này? Là vấn đề trong nguồn hoặc theo cách thủ công theo hướng dẫn, nếu nó là sau này có khả năng của bạn thiếu một bước? – BinaryMisfit
Câu hỏi vượt ra ngoài phạm vi của hướng dẫn ban đầu mà chỉ gợi ý tại Dependency Injection nhưng không bao giờ đến xung quanh để hiển thị như thế nào nó nên được thực hiện. Tôi sẽ làm rõ câu hỏi. – JohannesH