【发布时间】:2014-04-29 20:22:44
【问题描述】:
我正在开发一个 webapi 项目并使用 Unity 作为我们的 IOC 容器。我有一组分层依赖项,如下所示:
unityContainer.RegisterType<BaseProvider, CaseProvider>(new HierarchicalLifetimeManager());
unityContainer.RegisterType<IRulesEngine, RulesEngine>();
unityContainer.RegisterType<IQuestionController, QuestionController>();
unityContainer.RegisterType<IAPIThing, WebAPIThing>();
现在 BaseProvider 的构造函数接受一个 int 作为参数,它是 Case 标识符。 WebAPIThing 在其构造函数中采用 BaseProvider。通常在非 Web 场景中,我会使用以下内容注入案例 ID:
public static IAPIThing GetIAPIThing(int caseId)
{
return CreateUnityContainer().Resolve<IAPIThing >(new ParameterOverride("caseId", caseId).OnType<CaseProvider>());
}
但这仅在我明确调用该方法时才有效。在 Web API 场景中,我使用的是
config.DependencyResolver = new UnityDependencyResolver(unityContainer); 解析我的 api 控制器。
我想我仍然需要影响 DependencyResolver 在运行时解析 BaseProvider 对象的方式。
有人必须做类似的事情吗?
编辑 1
我尝试使用以下似乎可行的方法:
unityContainer.RegisterType<BaseProvider>(
new HierarchicalLifetimeManager()
, new InjectionFactory(x =>
new CaseProvider(SessionManager.GetCaseID())));
【问题讨论】:
-
caseId来自哪里?caseId的调用者是如何构造GetIAPIThing的?这个值是否来自会话、请求参数、cookie? -
@Steven CaseId 将从会话中存储和提供。
标签: c# asp.net-web-api dependency-injection unity-container