1

好的,所以我看了很多关于如何让 DI 使用 Web API 的帖子。尝试做简单的ctor注入。我在此处粘贴的内容有效,但这并不意味着我对此感到满意。如果有人有什么建议,请发出声音。

看来我们不必控制 WEB API 中的控制器创建,这让我质疑依赖关系的正确释放。我将事物设置为范围,您将通过查看代码来了解。我们被迫使用 IDependencyResolver,我认为这很糟糕,但这是我能找到的唯一解决方法,因为我尝试使用 IControllerActivator 的其他钩子似乎都不起作用。

见代码。

public class WindsorWeApiResolver:WindsorWebApiDependencyScope,IDependencyResolver
{
    private readonly IWindsorContainer _container;

    public WindsorWeApiResolver(IWindsorContainer container) : base(container)
    {
        _container = container;
    }

    public IDependencyScope BeginScope()
    {
        return new WindsorWebApiDependencyScope(_container);
    }
}
public class WindsorWebApiDependencyScope:IDependencyScope
{
    private readonly IWindsorContainer _container;
    private readonly IDisposable _scope;

    public WindsorWebApiDependencyScope(IWindsorContainer container)
    {
        _container = container;
        _scope = _container.BeginScope();
    }

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

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

    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.ResolveAll(serviceType).Cast<object>().ToArray();
    }


}
4

2 回答 2

1

我同意 IDependencyResolver 并不理想。我试图通过使用 Typed Factory Facility 作为范围来否定缺少发布方法,而不与 MVC 抗争。在这里查看我的帖子。您的控制器可以像往常一样采用构造函数参数。

于 2012-08-10T22:04:46.457 回答
0

您可以找到构造函数注入实现示例:

http://nikosbaxevanis.com/2012/07/16/using-the-web-api-dependency-resolver-with-castle-windsor-scoped-lifetime/

于 2012-08-08T11:14:54.403 回答