asp.net-mvc – 在ASP.NET MVC ContactsManager教程中是否有一个
如果你不知道我在说什么,要么通过
the tutorial,并尝试添加依赖注入自己或尝试你的运气与我的问题的解释。
注意:此问题不在ASP.NET原始教程的范围内。本教程仅表明所使用的模式是依赖注入友好的。 问题基本上是在Controller,ModelStateWrapper和ContactManagerService之间有一个依赖循环。 > ContactController构造器需要一个IContactManagerService。 所以依赖循环如下所示:Controller>服务> ModelStateWrapper>控制器 如果您尝试添加依赖注入,它将失败。所以我的问题是我该怎么办?其他人已经发布了这个问题,但答案很少,不同,而且似乎都是“黑客”。 我目前的解决方案是从IService构造函数中删除IModelStateWrapper,并添加一个Initialize方法,而不是这样: 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容器吗?我缺少什么? 解决方法
作为一般考虑,循环依赖表示设计缺陷 – 我想我可以安全地说这个,因为你不是代码的原始作者:)
我不会认为Initialize方法是一个很好的解决方案。除非您处理附加情况(您不是),否则方法注入不是正确的解决方案。你几乎已经知道了,因为你发现不方便你需要手动调用它,因为你的DI容器不能。 除非我完全错误,否则ContactController在调用Action方法之前不需要IValidationDictionary实例? 如果这是真的,最简单的解决方案可能是定义一个IValidationDictionaryFactory接口,并使ContactController构造函数接受此接口的实例。 这个接口可以这样定义: public interface IValidationDictionaryFactory { IValidationDictionary Create(Controller controller); } 需要IValidationDictionary实例的控制器上的任何Action方法都可以调用Create方法来获取实例。 默认实现将如下所示: public class DefaultValidationDictionaryFactory : IValidationDictionaryFactory { public IValidationDictionary Create(Controller controller) { return controller.ModelState; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – MVC 3 htmlhelper的扩展方法来包装内容
- 在asp.net应用程序中打开/关闭连接的好习惯?
- 循环遍历ASP.NET缓存对象中的键
- 由于ErrorCode =’0x80004005:80008083,.NET Core应用程序
- asp.net-mvc – 在MVC 3中回发到控制器操作后,ViewModel集合
- asp.net – 在IE7 / IE8中未定义window.XMLHttpRequest
- asp.net – Telerik RadGrid具有不同类型的编辑控件
- vs .net CS0006 C# 未能找到元数据文件 .dll
- asp.net-mvc-4 – 可为空的可选url参数的ASP.NET MVC 4 RC
- asp.net-mvc-4 – 编辑并继续不在Windows 7,32位操作系统上