Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 注册模块Autofac_C#_Asp.net_Asp.net Core_Dependency Injection_Autofac - Fatal编程技术网

C# 注册模块Autofac

C# 注册模块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

我在asp.net core web应用程序中使用带autofaq的.NetCore 2.1,我的问题是我的服务模块的加载方法没有启动,我正在实例化它的一个新实例作为registermodule的参数,我的服务模块的构造函数正在启动,这是一个非常典型的设置,我做错了什么,这里的人都看得出来吗

ServiceModule.cs

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
}