我有以下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;
我不知道为什么会这样。我有相同的设置在我的项目中我在其他项目中。当我将其他项目与此进行比较时,我看不出任何差异。
答案 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;