没有任何构造函数发现 - autofac

时间:2018-03-30 15:49:25

标签: c# asp.net-mvc autofac

我有以下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;
}

每次启动应用程序时,都会出现以下错误:

  

没有找到的构造函数   &#39; Autofac.Core.Activators.Reflection.DefaultConstructorFinder&#39;在类型上   &#39; Soundyladder.Service.Services.UserService&#39;可以用。调用   可用的服务和参数:无法解析参数   &#39; Soundyladder.DataAccess.Repositories.IUserRepository userRepository&#39;   构造函数&#39; Void   .ctor(Soundyladder.DataAccess.Repositories.IUserRepository)&#39 ;.   描述:执行期间发生未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

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

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

2 个答案:

答案 0 :(得分:1)

看起来您只注册“服务”后缀类型,并忘记了“存储库”后缀类型。

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

答案 1 :(得分:0)

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

我更改了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;