gpt4 book ai didi

c# - DependencyResolver + Owin + WebApi2

转载 作者:太空狗 更新时间:2023-10-29 22:26:18 26 4
gpt4 key购买 nike

Owin 的一大优点是它不依赖于 System.Web。如果 WebApi 明确需要这些方面的内容,我到底该如何设置 DI:

var config = new HttpConfiguration();
var container = new WindsorContainer().Install(new ControllerInstaller());
container.Install(FromAssembly.This());
config.DependencyResolver = ...

config.DependencyResolver 需要来自 System.Web.Http.DependenciesIDependencyResolver 的具体内容?

我对使用 WebApi + Owin + CaSTLe.Windsor 的 C# 代码特别感兴趣(谷歌还没有提供太多帮助)。

最佳答案

我已经设法让它工作:

[assembly: OwinStartup(typeof(Bla.Startup))]
namespace Bla
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
//...
var container = new WindsorContainer().Install(new ControllerInstaller());
var httpDependencyResolver = new WindsorHttpDependencyResolver(container);
config.DependencyResolver = httpDependencyResolver;
//...
}
}

public class ControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(AllTypes.FromThisAssembly()
.Pick().If(t => t.Name.EndsWith("Controller"))
.Configure(configurer => configurer.Named(configurer.Implementation.Name))
.LifestylePerWebRequest());

//...
}
}

internal class WindsorDependencyScope : IDependencyScope
{
private readonly IWindsorContainer _container;
private readonly IDisposable _scope;

public WindsorDependencyScope(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}

_container = container;
_scope = container.BeginScope();
}

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

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

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

internal sealed class WindsorHttpDependencyResolver : IDependencyResolver
{
private readonly IWindsorContainer _container;

public WindsorHttpDependencyResolver(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}

_container = container;
}

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

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

public IDependencyScope BeginScope()
{
return new WindsorDependencyScope(_container);
}

public void Dispose()
{
}
}

我面临的问题是使用:

config.DependencyResolver = httpDependencyResolver;

引入对 system.web 的依赖。因此,当我尝试在某些集成测试中使用 owin testserver 时,我遇到了问题。我将发布另一个问题。

关于c# - DependencyResolver + Owin + WebApi2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25421610/

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