c# - 使用 MVVMLight 时如何设置 Web API DependencyResolver
问题描述
我正在使用 OWIN 在使用 galasoft mvvmlight 框架的 wpf 桌面应用程序中自行托管 Web api Web 服务。当我尝试将我的模型数据服务之一依赖注入到 web api 控制器时,我收到一个关于“确保控制器具有无参数的公共构造函数”的错误。
我知道 web api 控制器不支持开箱即用的依赖注入。我看过很多例子,详细说明了如何IDependencyResolver
在使用 Unity 或编写自己的代码时提供自定义。有没有使用 mvvmlight设置DependencyResolver
web api 启动类对象属性的简单方法?HttpConfiguration
SimpleIoc.Default
作为一种解决方法,我目前正在通过调用SimpleIoc.Default.GetInstance()
我的 api 控制器构造函数来设置我的数据服务。这可行,并且在功能上可能与依赖注入机制相同,但依赖注入似乎更优雅。
public class webApiStartup {
public void Configuration(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "FileServerApi",
routeTemplate: "{controller}/{filename}"
,defaults: new { Controller = "filesController" }
);
//*
//* The Following line of Code does not work. But intellisense suggests
//* that there is a conversion available ?
//*
config.DependencyResolver = (IDependencyResolver)SimpleIoc.Default;
appBuilder.UseWebApi(config);
}
}
//*
//* This constructor for the web api controller works
//* but it is not as elegant as dependency injection
//*
public class filesController : ApiController
{
ILocalDataService _LocalDataSvc = null;
public filesController() {
_LocalDataSvc = SimpleIoc.Default.GetInstance<ILocalDataService>();
}
解决方案
演员表
config.DependencyResolver = (IDependencyResolver)SimpleIoc.Default;
将失败,因为SimpleIoc
不是从IDependencyResolver
.
为派生自的容器创建一个包装器IDependencyResolver
public class SimpleIocResolver : IDependencyResolver {
protected ISimpleIoc container;
public SimpleIocResolver(ISimpleIoc container) {
if (container == null) {
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetService(Type serviceType) {
try {
return container.GetInstance(serviceType);
} catch(Exception) {
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType) {
try {
return container.GetAllInstances(serviceType);
} catch (Exception) {
return new List<object>();
}
}
public IDependencyScope BeginScope() {
return new SimpleIocResolver(container);
}
public void Dispose() {
//No Op
}
}
并在配置时使用它
config.DependencyResolver = new SimpleIocResolver(SimpleIoc.Default);
然后可以重构 ApiController
public class FilesController : ApiController {
ILocalDataService _LocalDataSvc = null;
public FilesController(ILocalDataService svc) {
_LocalDataSvc = svc;
}
//...
前提是依赖项已在容器中注册。
ASP.NET Web API 2 中的引用依赖注入
推荐阅读
- apache-kafka - java.lang.IllegalArgumentException:未知的压缩类型 id:5
- jenkins - 将更改推送到特定分支时,在钩子触发器上触发詹金斯管道
- flutter - 如何使用官方 Flutter 库
- android - horisontalscrollView 内视图组内的 Imageview 中的额外空间
- javascript - 如何将 JavaScript 文件转换为抽象语法树
- popup - 如何根据openlayers 2中的内容调整弹出窗口的大小
- eclipse-plugin - Eclipse 运行时未激活新添加的 UI 插件
- android - 当我尝试这个我遇到错误时,有什么方法可以在不同的电脑上处理相同的 android studio 项目吗?
- npm - 如何防止下一个 npm 命令运行?
- asp.net - 是否存在不易受运行时错误影响的 app_offline.htm 的替代方案?