从温莎城堡转换为Autofac
本文关键字:Autofac 转换 城堡 | 更新日期: 2023-09-27 18:29:35
我需要在过滤器上使用属性注入,不幸的是Castle不支持它。所以我不得不将我的IoC更改为Autofac。然而,我在这样做时遇到了问题。
如何更改以下代码以使用Autofac。
container.Register(
Component.For<ILogService>()
.ImplementedBy<LogService>()
.LifeStyle.Singleton,
Component.For(typeof(IDatabaseFactory<>))
.ImplementedBy(typeof(DatabaseFactory<>))
.LifestylePerWebRequest(),
Component.For(typeof(IUnitOfWork<>))
.ImplementedBy(typeof(UnitOfWork<>))
.LifestylePerWebRequest(),
Types.FromThisAssembly()
.BasedOn<IHttpController>()
.LifestyleTransient(),
Classes.FromAssemblyNamed("MyServer.DAL")
.Where(type => type.Name.EndsWith("Repository"))
.WithServiceAllInterfaces()
.LifestylePerWebRequest(),
Classes.FromAssemblyNamed("MyServer.Service")
.Where(type => type.Name.EndsWith("Service"))
.WithServiceAllInterfaces()
.LifestylePerWebRequest()
);
另外,使用Castle,我在Global.asax中对容器进行代码处理。Autofac允许容器处理吗?
使用Autofac,您需要使用ContainerBuilder对象来注册类型并从此对象构建容器。
所以,首先你需要做这样的事情:
var builder = new ContainerBuilder();
然后,您可以使用生成器根据您想要的使用寿命来注册类型(我将向您展示如何注册Singleton和Generic类型,您可以参考文档来查看如何执行其他类型,如扫描程序集以查找类型等)
i。对于Singleton,您可以使用以下内容:
// Register instances of objects you create...
var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();
ii。对于Generics实现,您可以使用以下内容:
builder.RegisterGeneric(typeof(NHibernateRepository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
最后,您需要按照如下方式构建容器:
// Build the container to finalize registrations
// and prepare for object resolution.
var container = builder.Build();
- 此外,在文档中,您可以找到一个部分,展示如何进行属性注入。但是,如果您想对Web API操作筛选器执行此操作,您需要知道,当首次在Web API中创建筛选器实例时,它们是缓存的,因此Autofac必须使用根生存期范围而不是请求生存期范围来解决属性注入。您可能需要使用
actionContext.Request.GetDependencyScope().GetService(typeof(IYourService);
查看此项以了解更多详细信息