C# 注册模块Autofac
我在asp.net core web应用程序中使用带autofaq的.NetCore 2.1,我的问题是我的服务模块的加载方法没有启动,我正在实例化它的一个新实例作为registermodule的参数,我的服务模块的构造函数正在启动,这是一个非常典型的设置,我做错了什么,这里的人都看得出来吗 ServiceModule.csC# 注册模块Autofac,c#,asp.net,asp.net-core,dependency-injection,autofac,C#,Asp.net,Asp.net Core,Dependency Injection,Autofac,我在asp.net core web应用程序中使用带autofaq的.NetCore 2.1,我的问题是我的服务模块的加载方法没有启动,我正在实例化它的一个新实例作为registermodule的参数,我的服务模块的构造函数正在启动,这是一个非常典型的设置,我做错了什么,这里的人都看得出来吗 ServiceModule.cs namespace MyApp.Managers.DependencyManagement { public class ServiceModule : Modul
namespace MyApp.Managers.DependencyManagement
{
public class ServiceModule : Module
{
public ServiceModule()
{
Console.WriteLine("YES THIS LINE OF CODE IS FIRING?");
}
protected override void Load(ContainerBuilder builder)
{
Console.WriteLine("Why am i not firing? :-( ");
builder.RegisterType<ItemManager>().As<IItemManager>().InstancePerLifetimeScope();
}
}
}
ServiceConfiguration.cs(构造函数正在启动,但加载方法从未启动)
名称空间MyApi.Api
{
公共类服务配置
{
公共静态ContainerBuilder寄存器(操作附加注册、字符串连接字符串)
{
var containerBuilder=新的containerBuilder();
containerBuilder.RegisterType().As().InstancePerLifetimeScope();
containerBuilder.RegisterType().AsSelf().InstancePerLifetimeScope();
containerBuilder.RegisterModule(新存储模块()
{
ConnectionString=ConnectionString,
});
containerBuilder.RegisterModule(new Managers.DependencyManagement.ServiceModule());
额外注册(集装箱建造商);
返回集装箱船;
}
}
}
使用autofac,您可以通过以下几种方式进行创建:
在您的服务上实现IStartable
,并添加Start()
方法
或者像这样:
var builder = new ContainerBuilder();
builder.RegisterBuildCallback(c => c.Resolve<DbContext>());
// The callback will run after the container is built
// but before it's returned.
var container = builder.Build();
ServiceConfiguration.Register(this.AddWebServices, connectionString, builder);
var builder=newcontainerbuilder();
RegisterBuildCallback(c=>c.Resolve());
//回调将在容器生成后运行
//但在它回来之前。
var container=builder.Build();
您没有使用传递给ConfigureContainer()
方法的ContainerBuilder
,而是在ServiceConfiguration.Register()
中实例化并使用一个新的容器,但它不是ASP.NET核心框架中连接的,也不会由它构建。这就是为什么Load()
没有启动的原因,您应该使用框架所使用的
尝试将其传递给静态方法,如下所示:
var builder = new ContainerBuilder();
builder.RegisterBuildCallback(c => c.Resolve<DbContext>());
// The callback will run after the container is built
// but before it's returned.
var container = builder.Build();
ServiceConfiguration.Register(this.AddWebServices, connectionString, builder);
并在您的方法中使用它,如:
public static ContainerBuilder Register(Action<ContainerBuilder> additionalRegistration,
string connectionString,
ContainerBuilder containerBuilder)
{
containerBuilder.RegisterType<ConfigurationStore>()
.As<IConfigurationStore>()
.InstancePerLifetimeScope();
// the rest
}
publicstaticcontainerbuilder寄存器(Action additionalRegistration,
字符串连接字符串,
集装箱建造商(集装箱建造商)
{
containerBuilder.RegisterType()
.As()
.InstancePerLifetimeScope();
//其余的
}
我试图让每个服务项目负责各自的依赖关系,因此ServiceModule.cs存在于每个单独的项目中,但从api项目中的ServiceConfiguration.cs调用。代码行containerBuilder.RegisterModule(new Managers.DependencyManagement.ServiceModule());正在启动,为什么加载方法没有在模块中启动,这正是我想弄明白的。正如我提到的servicemodule.cs的构造函数正在启动一样,autofac应该处理调用加载方法的问题,这在他们的文档中。
public static ContainerBuilder Register(Action<ContainerBuilder> additionalRegistration,
string connectionString,
ContainerBuilder containerBuilder)
{
containerBuilder.RegisterType<ConfigurationStore>()
.As<IConfigurationStore>()
.InstancePerLifetimeScope();
// the rest
}