gpt4 book ai didi

c# - 使用 MVVMLight 时如何设置 Web API DependencyResolver

转载 作者:行者123 更新时间:2023-12-03 10:25:47 26 4
gpt4 key购买 nike

我正在使用 OWIN 在使用 galasoft mvvmlight 框架的 wpf 桌面应用程序中自行托管 Web api Web 服务。当我尝试将我的模型数据服务之一依赖注入(inject)到 web api Controller 时,我收到一个关于“确保 Controller 具有无参数的公共(public)构造函数”的错误。

我知道 web api Controller 不支持开箱即用的依赖注入(inject)。我看过许多详细说明如何提供自定义 IDependencyResolver 的示例。使用 Unity 或编写自己的代码时。有没有一种简单的方法来设置 DependencyResolver Web api 启动类的属性HttpConfiguration使用 mvvmlight SimpleIoc.Default 的对象?

作为一种解决方法,我目前正在通过调用 SimpleIoc.Default.GetInstance() 来设置我的数据服务。在我的 api Controller 构造函数中。这可行,并且可能在功能上与依赖注入(inject)机制相同,但依赖注入(inject)似乎更优雅。

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;
}

//...

前提是依赖项已在容器中注册。

引用 Dependency Injection in ASP.NET Web API 2

关于c# - 使用 MVVMLight 时如何设置 Web API DependencyResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54032924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com