2

我有 WebForms 项目,并且有 WebApi 控制器。我如何注入控制器构造函数和动作过滤器构造函数?

我已经在( ) 中实现IDependencyResolver并使用了它,但它没有帮助:请求控制器说没有默认构造函数,应用程序启动时的过滤器说它不包含带 0 个参数的构造函数。Global.asaxGlobalConfiguration.Configuration.DependencyResolver

此外,我需要单音注入到动作过滤器。

谢谢。

UPD

public class ScopeContainer : IDependencyScope
{
    protected readonly IUnityContainer _container;

    public ScopeContainer(IUnityContainer container)
    {
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>();
    }

    public void Dispose()
    {
        _container.Dispose();
    }
}

public class IoCContainer : ScopeContainer, IDependencyResolver
{
    public IoCContainer(IUnityContainer container) : base(container)
    {
    }

    public IDependencyScope BeginScope()
    {
        var child = _container.CreateChildContainer();

        return new ScopeContainer(child);
    }
}

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
        ConfigureApi(GlobalConfiguration.Configuration);
    }

    void ConfigureApi(HttpConfiguration config)
    {
        var unity = new UnityContainer();

        unity.RegisterInstance<ILogger>(new Logger());
        unity.RegisterType<IRepository, DbRepository>();

        config.DependencyResolver = new IoCContainer(unity);
    }

    private static void RegisterRoutes()
    {
        RouteTable.Routes.MapHttpRoute("ServiceApi", "api/{controller}/{action}");
    }
}

4

2 回答 2

2

我认为这可能是您注册路线的方式。

WebApi 路由通过GlobalConfiguration.Routes而不是RouteTable.RoutesMVC 控制器使用的在默认项目示例中注册。如果 MVC 路由方法错误地加载了 ApiController,它将找不到您的依赖关系解析器。

尝试将您的代码修改为:

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(GlobalConfiguration.Configuration);
        ConfigureApi(GlobalConfiguration.Configuration);
    }

    void ConfigureApi(HttpConfiguration config)
    {
        var unity = new UnityContainer();

        unity.RegisterInstance<ILogger>(new Logger());
        unity.RegisterType<IRepository, DbRepository>();

        config.DependencyResolver = new IoCContainer(unity);
    } 

    private static void RegisterRoutes(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute("ServiceApi", "api/{controller}/{action}");
    }

}
于 2012-12-13T16:27:00.127 回答
1

我遇到了同样的问题,我正在做一个项目,试图通过将页面逐页转换为 Web API / Angular 来帮助使旧的 Web 表单项目现代化,并且让管道恰到好处地使用 Unity 是关键。

当我在跟踪时,我注意到 unity 试图解析控制器类,而不是注入其构造函数的类型,所以我注册了我的控制器并且一切正常。请参阅下面的示例

配置设置,注册控制器和依赖

void ConfigureApi(HttpConfiguration config)
{
        var container = UnitySingleton.UnityContainer;
        container.RegisterType<IDashboardManager, ExampleStuff>();
        container.RegisterType<DashboardController>(new InjectionConstructor(container.Resolve<IDashboardManager>()));
        config.DependencyResolver = new UnityIoCContainer(container);
}

我的控制器示例:

public class DashboardController : ApiController
{
    private readonly IDashboardManager _dashboardManager;

    public DashboardController(IDashboardManager dashboardManager)
    {
        _dashboardManager = dashboardManager;
    }

    public async Task<IEnumerable<string>> Get()
    {
        return await _dashboardManager.GetDatas();
    }
}

这就是我的工作方式。这与上面的文章有点不同。

于 2015-09-19T03:38:47.947 回答