如果你不知道我说的是要么去通过本教程 ,并尝试自己添加依赖注入或试试你的运气与我的问题的解释。
注意:这个问题是不是在ASP.NET原教程的范围之内。 本教程仅表明使用的模式是依赖注入友好。
问题基本上有控制器,所述ModelStateWrapper和ContactManagerService之间的依赖循环。
- ContactController中constuctor需要一个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容器? 我缺少的东西吗?