从温莎城堡转换为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

使用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);

查看此项以了解更多详细信息