首页 > 解决方案 > 使用 MVVMLight 时如何设置 Web API DependencyResolver

问题描述

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

我知道 web api 控制器不支持开箱即用的依赖注入。我看过很多例子,详细说明了如何IDependencyResolver在使用 Unity 或编写自己的代码时提供自定义。有没有使用 mvvmlight设置DependencyResolverweb api 启动类对象属性的简单方法?HttpConfigurationSimpleIoc.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>();
    }

标签: c#mvvmdependency-injectionasp.net-web-api2mvvm-light

解决方案


演员表

 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 中的引用依赖注入


推荐阅读