如果你不知道我在說什麼,要麼通過the tutorial,並嘗試自己添加依賴注入或嘗試你的運氣與我對問題的解釋。在ASP.NET MVC的ContactsManager教程中有沒有解決依賴注入循環問題的好方法?
注意:此問題不在ASP.NET原始教程的範圍內。本教程只提示使用的模式是依賴注入友好的。
問題是,控制器,ModelStateWrapper和ContactManagerService之間存在依賴關係。
- ContactController構造函數接受一個IContactManagerService。
- ContactManagerService構造函數接受一個IContactManagerRepository (不重要)和一個IValidationDictionary (ModelStateWrapper實現)。
- ModelStateWrapper構造函數採用ModelStateDictionary (這是控制器上名爲「ModelState」的屬性)。
所以依賴循環是這樣的:控制器>服務> ModelStateWrapper>控制器
如果試圖依賴注入添加到這一點,就會失敗。所以我的問題是;我該怎麼做呢?其他人已經發布了這個問題,但答案很少,不同,而且似乎有點「黑客」。
我目前的解決方案是從IService構造函數刪除IModelStateWrapper,並添加一個初始化方法,而不是像這樣:
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...
}
有了這個結構,我可以配置我統一容器是這樣的:
public static void ConfigureUnityContainer()
{
IUnityContainer container = new UnityContainer();
// Registrations
container.RegisterTypeInHttpRequestLifetime<IContactRepository, EntityContactRepository>();
container.RegisterTypeInHttpRequestLifetime<IContactService, ContactService>();
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
}
不幸的是,這意味着服務的「初始化」方法必須由控制器構造函數手動調用。有沒有更好的辦法?也許我以某種方式在我的統一配置中包含IValidationDictionary?我應該切換到另一個DI容器嗎?我錯過了什麼嗎?
我不得不承認,我已經做了這個教程3次,不曾經遇到這樣?源代碼中的問題還是手動跟隨教程,如果是後者,您可能會錯過一個步驟? – BinaryMisfit 2009-09-21 06:43:38
這個問題超出了原始教程的範圍,它只暗示了依賴注入,但從來沒有出現過如何顯示它應該如何完成。我會澄清這個問題。 – JohannesH 2009-09-21 06:50:30