Autofac - 自动注册错误:找不到带有“公共绑定标志”的构造函数
本文关键字:绑定 标志 构造函数 注册 错误 找不到 Autofac | 更新日期: 2023-09-27 18:36:48
这是我的Global.asax.cs
public void RegisterContainersUsingAutofac()
{
//http://elegantcode.com/2009/01/07/ioc-libraries-compared/
//http://www.codeproject.com/Articles/25380/Dependency-Injection-with-Autofac
//https://code.google.com/p/autofac/
//http://api.autofac.org/
var builder = new ContainerBuilder();
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();
//builder.RegisterType<AuthenticationService>().As<IAuthenticationService>();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//builder.RegisterAssemblyTypes(typeof(SecurityService).Assembly).
// Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest();
builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).InstancePerLifetimeScope()
.OnRelease(x =>{((IUnitOfWork)x).Commit();});
builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(SecurityService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
我遇到以下错误: 在类型"AppBase.Service.UserService"上找不到带有"公共绑定标志"的构造函数。
我注册了存储库和服务的已实现接口,但是哪里出错了?它在下面中断。
这是我的用户服务
public interface IUserService
{
int Login(string userNameOrEmail, string password, out int errorcode, out int timeout);
bool Register(string userName, string password, string email, string country, string language, out int errorCode);
bool Register(User user, out int errorCode);
bool ResetPassword(string username, string email, string oldPassword, string newPassword, out int errorCode);
void DeleteUser(string userName);
}
public class UserService : IUserService
{
private readonly IUserRepository userRepository;
private UserService(IUserRepository _userRepository)
{
userRepository = _userRepository;
}
//other methods ...
}
这是我的错误:
[DependencyResolutionException: No constructors on type 'AppBase.Service.UserService' can be found with 'Public binding flags'.]
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) +261
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +91
Autofac.Core.Resolving.InstanceLookup.Execute() +135
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +434
Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +61
Autofac.Core.Activators.Reflection.<>c__DisplayClass2.<CanSupplyValue>b__0() +68
Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() +201
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters) +499
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters) +91
Autofac.Core.Resolving.InstanceLookup.Execute() +135
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters) +434
Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +52
Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters) +115
Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters) +300
Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance) +103
Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters) +218
Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters) +64
Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType) +43
Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(Type serviceType) +49
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +51
[InvalidOperationException: An error occurred when trying to create a controller of type 'AppBase.Web.Controllers.AccountController'. Make sure that the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232
System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49
System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8968180
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
我不确定为什么UserService
有一个私有构造函数。这有什么原因吗?
通过定义构造函数,不再生成默认构造函数public UserService()
。
Autofac 只会注入到公共构造函数中,而您现在没有公共构造函数。如果您将其更改为公共,它应该可以工作。
@HackedByChinese答案是正确的。
Re-sharper建议我在服务层中抽象化一个类。这还可以防止生成默认的公共构造函数。这让我有点烦恼,所以我认为这可能会帮助其他人。