使用 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 找到的构造函数的 Autofac None
Autofac None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'LMS.Services.Security.EncryptionService' can be invoked with the available services and parameters:
Cannot resolve parameter 'LMS.Models.SecuritySettings securitySettings' of constructor 'Void .ctor(LMS.Models.SecuritySettings)'
这是代码文件
服务Class
public class EncryptionService : IEncryptionService
{
private readonly SecuritySettings _securitySettings;
public EncryptionService(SecuritySettings securitySettings)
{
this._securitySettings = securitySettings;
}
}
引导程序
private static void SetAutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest();
builder.RegisterAssemblyTypes(typeof(CourseRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterAssemblyTypes(typeof(CourseService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
它早些时候工作。但是当我引入 EncryptionService
实现时,我收到了上述错误。
这是其他工作代码实现如下
public class CourseService : ICourseService
{
#region Fields
private readonly IRepository<Course> _courseRepository;
private readonly IUnitOfWork _unitOfWork;
#endregion
#region ctor
public CourseService(IRepository<Course> courseRepository, IUnitOfWork unitOfWork)
{
_courseRepository = courseRepository;
_unitOfWork = unitOfWork;
}
#endregion
}
当 Autofac 尝试解析 EncryptionService
时,它会尝试解析 SecuritySettings
服务,但 Autofac 不是知道这样的注册。
要解决此错误,您应该注册一个 SecuritySettings
实现。
例如:
builder.RegisterType<SecuritySettings>()
.As<SecuritySettings>();
您还可以通过添加 AnyConcreteTypeNotAlreadyRegisteredSource
(请参阅 the docs for Sources)调整 Autofac 的行为以按您最初预期的方式工作[并与其他一些容器的默认值保持一致]:-
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
我已经将此方案与 delegate factories and implicit Relationship Types 一起使用,几乎从一套应用程序中删除了显式注册,但由于您似乎已经走上了显式(boilerplaty :P)注册的道路,我建议谷歌搜索 AnyConcreteTypeNotAlreadyRegisteredSource
以查看更广泛的方案是否更符合您的要求。
就我而言,我还没有注册上下文。我注册了上下文,它对我有用
builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope();
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'LMS.Services.Security.EncryptionService' can be invoked with the available services and parameters: Cannot resolve parameter 'LMS.Models.SecuritySettings securitySettings' of constructor 'Void .ctor(LMS.Models.SecuritySettings)'
这是代码文件
服务Class
public class EncryptionService : IEncryptionService
{
private readonly SecuritySettings _securitySettings;
public EncryptionService(SecuritySettings securitySettings)
{
this._securitySettings = securitySettings;
}
}
引导程序
private static void SetAutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest();
builder.RegisterAssemblyTypes(typeof(CourseRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterAssemblyTypes(typeof(CourseService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
它早些时候工作。但是当我引入 EncryptionService
实现时,我收到了上述错误。
这是其他工作代码实现如下
public class CourseService : ICourseService
{
#region Fields
private readonly IRepository<Course> _courseRepository;
private readonly IUnitOfWork _unitOfWork;
#endregion
#region ctor
public CourseService(IRepository<Course> courseRepository, IUnitOfWork unitOfWork)
{
_courseRepository = courseRepository;
_unitOfWork = unitOfWork;
}
#endregion
}
当 Autofac 尝试解析 EncryptionService
时,它会尝试解析 SecuritySettings
服务,但 Autofac 不是知道这样的注册。
要解决此错误,您应该注册一个 SecuritySettings
实现。
例如:
builder.RegisterType<SecuritySettings>()
.As<SecuritySettings>();
您还可以通过添加 AnyConcreteTypeNotAlreadyRegisteredSource
(请参阅 the docs for Sources)调整 Autofac 的行为以按您最初预期的方式工作[并与其他一些容器的默认值保持一致]:-
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
我已经将此方案与 delegate factories and implicit Relationship Types 一起使用,几乎从一套应用程序中删除了显式注册,但由于您似乎已经走上了显式(boilerplaty :P)注册的道路,我建议谷歌搜索 AnyConcreteTypeNotAlreadyRegisteredSource
以查看更广泛的方案是否更符合您的要求。
就我而言,我还没有注册上下文。我注册了上下文,它对我有用
builder.RegisterType<JComDbEntities>().AsSelf().As<DbContext>().InstancePerLifetimeScope();