在Autofac装配体扫描注册过程中未找到装配体的错误。

问题描述 投票:0回答:2

我打算在我的项目中自动连接接口和仓库,包括BL和DAL,但我遇到了一个问题,我不知道如何解决它。

以下是代码

namespace MovieManager.UI
{
    public static class ContainerConfig
    {
        public static IContainer Configure()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(Assembly.GetAssembly(typeof(HomeController))).InstancePerRequest();
            builder.RegisterControllers(Assembly.GetAssembly(typeof(MovieController))).InstancePerRequest();

            builder.RegisterAssemblyTypes(Assembly.Load(nameof(BL)))
                .Where(t => t.Namespace != null && t.Namespace.Contains("Repositories"))
                .As(t => t.GetInterfaces().FirstOrDefault(i => i.Name == "I" + t.Name));

            builder.RegisterAssemblyTypes(Assembly.Load(nameof(DAL)))
                .Where(t => t.Namespace != null && t.Namespace.Contains("Repositories"))
                .As(t => t.GetInterfaces().FirstOrDefault(i => i.Name == "I" + t.Name));

            //builder.RegisterType<MovieSupervisor>().As<IMovieSupervisor>();
            //builder.RegisterType<GenreTransactionSupervisor>().As<IGenreTransactionSupervisor>();


            //builder.RegisterType<MovieRepository>().As<IMovieRepository>();
            //builder.RegisterType<GenreRepository>().As<IGenreRepository>();
            //builder.RegisterType<GenreTransactionRepository>().As<IGenreTransactionRepository>();

            var containerBuilder = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(containerBuilder));
            return containerBuilder;
        }
    }
}

这是我的项目文件夹结构

enter image description here

并得到以下错误信息

enter image description here

我做错了什么。任何帮助将是感激的。

c# autofac autofac-configuration
2个回答
1
投票

这不是Autofac的问题,很可能只是因为名字不对,所以无法加载汇编。

这段代码 nameof(BL) 将显式地输出字符串 "BL"。我猜想你的程序集实际上是被称为 MovieManager.BL 基于项目名称,因此失败。

请注意 nameof(MovieManager.BL) 也会输出 "BL",因为nameof输出的是你提供的名称的最后一个组件。

你可以手动传递全名,或者,如果你有被引用的汇编,你可以直接采取与控制器相同的方法,从类型中获取汇编。


1
投票

问题出在注册的第二部分:.As(t => t.GetInterfaces().FirstOrDefault(i => i.Name == "I" + t.Name))

你的First或default过滤器可能返回null。

请检查服务名称和接口是否与FirstOrDefault中的条件相匹配。

另外,正如我之前在评论中提到的Assembly.Load需要有一个正确的Assembly名称,但你已经修正了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.