【问题标题】:None of the constructors found with - autofac没有使用 - autofac 找到的构造函数
【发布时间】:2018-03-31 06:21:30
【问题描述】:

我有以下 autofac-config:

public static void RegisterDI()
{
    var builder = GetBuilder();
    var container = builder.Build();

    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
public static ContainerBuilder GetBuilder()
{
    var builder = new ContainerBuilder();
    builder.RegisterControllers(Assembly.GetCallingAssembly());
    builder.RegisterFilterProvider();

    var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(x => x.FullName.Contains("Soundyladder")).ToArray();

    builder.RegisterAssemblyTypes(assemblies)
        .Where(t => t.Name.EndsWith("Service"))
        .AsImplementedInterfaces()
        .InstancePerRequest();

    builder.RegisterAssemblyModules(assemblies);

    return builder;
}

我的应用程序由三层组成:UI、Service 和 DataAcces。这是我的 DataAccess 层的 UserRepository:

public class UserRepository : IUserRepository
{
}

这是我在服务层的服务:

public UserService(IUserRepository userRepository)
{
    this._userRepository = userRepository;
}

这是我的控制器:

public UserController(IUserService userService)
{
    this._userService = userService;
}

每次启动应用程序时,我都会收到以下错误:

没有找到任何构造函数 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 类型 'Soundyladder.Service.Services.UserService' 可以用 可用的服务和参数:无法解析参数 'Soundyladder.DataAccess.Repositories.IUserRepository userRepository' 构造函数 'Void .ctor(Soundyladder.DataAccess.Repositories.IUserRepository)'。 说明:执行过程中发生未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:Autofac.Core.DependencyResolutionException:无 找到的构造函数 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 类型 'Soundyladder.Service.Services.UserService' 可以用 可用的服务和参数:无法解析参数 'Soundyladder.DataAccess.Repositories.IUserRepository userRepository' 构造函数 'Void .ctor(Soundyladder.DataAccess.Repositories.IUserRepository)'。

我不知道为什么会这样。我在这个项目中的设置与我在其他项目中的设置相同。当我将我的其他项目与此进行比较时,我看不出有任何区别。

【问题讨论】:

  • 看起来它希望您使用单个参数创建一个构造函数,即:public UserRepository(IUserRepository repo) { ... }
  • @RonBeyer:在我的存储库类中?
  • “任何人都可以帮助我”的答案是“是”,但这可能不是您真正想问的问题。作为一名编辑,我倾向于将其删减——最好的问题是具体的,例如“为什么 会出现在 中”。这比寻求“帮助”更容易回答,后者有点宽泛和不确定。

标签: c# asp.net-mvc autofac


【解决方案1】:

(代表问题作者发布解决方案)

我更改了 autofac 配置。现在它正在工作:

    var builder = new ContainerBuilder();
    builder.RegisterControllers(Assembly.GetExecutingAssembly());
    builder.RegisterFilterProvider();

    var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(x => x.FullName.Contains("Soundyladder")).ToArray();
    builder.RegisterAssemblyTypes(assemblies)
        .AsImplementedInterfaces()
        .InstancePerRequest();

    return builder;

【讨论】:

    【解决方案2】:

    您似乎只注册了“服务”后缀类型,而忘记了“存储库”后缀类型。

    .Where(t => t.Name.EndsWith("Service"))
    

    【讨论】:

    • 但是我在存储层没有什么要解决的?
    • IUserService 依赖于IUserRepository,因此如果您尝试解析 IUserService,DependencyResolver 将尝试解析所有依赖类,然后再为您提供所需的 IUserService 实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2012-01-10
    相关资源
    最近更新 更多