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.Dependencies的具体的IDependencyResolver
我特别感兴趣的是C#代码,它使用了WebApi + Owin + Castle.Windsor (谷歌对此帮助不大)。
发布于 2014-08-22 08:07:03
我已经设法让它使用了:
[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时,我会遇到一些问题。我会提出另一个问题。
发布于 2014-08-22 05:27:35
看看这里- “Mark在ASP.NET Web中的依赖注入与城堡温莎”。然后在马克·西曼的博客档案。他讲了很多关于DI和WEB的内容,并且经常使用。我打赌城堡温莎是他最喜欢的DI容器。当您查看存档时,不要只查看WEB。有时,他在不同标题下发布关于WEB的文章。
如果你读了他那本好书,你就会对IoC/DI这个话题有很好的理解。很好的书。
https://stackoverflow.com/questions/25421610
复制相似问题