Asp.net-Mvc

嘗試創建類型為“TypeNewsController”的控制器時發生錯誤

  • April 18, 2016

我已經搜尋了很長時間,但沒有找到任何幫助。我哪裡錯了?我真的不知道該怎麼辦。我在下面寫了所有細節。我已經嘗試過,但沒有成功。

嘗試創建類型為“TypeNewsController”的控制器時發生錯誤。確保控制器有一個無參數的公共建構子。

public class MvcApplication : System.Web.HttpApplication
   {
       protected void Application_Start()
       {
           WebApiConfig.Register(GlobalConfiguration.Configuration);
           AreaRegistration.RegisterAllAreas();
           FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
           RouteConfig.RegisterRoutes(RouteTable.Routes);
           BundleConfig.RegisterBundles(BundleTable.Bundles);
           Bootstrapper.Run();
       }
   }

我的 api 控制器:

public class TypeNewsController : ApiController
   {
       private readonly ITypeNewsService _typeNewsService;

       public TypeNewsController(ITypeNewsService typeNewsService)
       {
           _typeNewsService = typeNewsService;
       }
       [HttpGet]
       public TypeNewsResponse Get([ModelBinder] PageRequest model)
       {
           model = model ?? new PageRequest();
           var output = _typeNewsService.GetTypeNewss().ToList();
           return new TypeNewsResponse
           {
               Page = model.PageIndex,
               Records = model.PageSize,
               Rows = output.ToList(),
               Total = output.Count() / model.PageSize,
           };
       }
   }

錯誤 :

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
An error occurred when trying to create a controller of type 'TypeNewsController'. Make sure that the controller has a parameterless public constructor.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
</StackTrace>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Type 'JuventusNewsSiteApk.Controllers.TypeNewsController' does not have a default constructor
</ExceptionMessage>
<ExceptionType>System.ArgumentException</ExceptionType>
<StackTrace>
at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
</StackTrace>
</InnerException>
</Error>

引導程序類:

public static class Bootstrapper
   {
       public static void Run()
       {
           SetAutofacContainer();
           //Configure AutoMapper
           AutoMapperConfiguration.Configure();
       }

       private static void SetAutofacContainer()
       {
           var builder = new ContainerBuilder();
           builder.RegisterControllers(Assembly.GetExecutingAssembly());
           builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
           builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
           builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest();
           builder.RegisterAssemblyTypes(typeof(NewsRepository).Assembly)
               .Where(t => t.Name.EndsWith("Repository"))
               .AsImplementedInterfaces().InstancePerRequest();
           builder.RegisterAssemblyTypes(typeof(NewsService).Assembly)
               .Where(t => t.Name.EndsWith("Service"))
               .AsImplementedInterfaces().InstancePerRequest();

           builder.RegisterAssemblyTypes(typeof(DefaultFormsAuthentication).Assembly)
               .Where(t => t.Name.EndsWith("Authentication"))
               .AsImplementedInterfaces().InstancePerRequest();

           builder.Register(
               c => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new JuventusNewsApkEntities())))
               .As<UserManager<ApplicationUser>>().InstancePerRequest();

           builder.RegisterFilterProvider();
           IContainer container = builder.Build();
           DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
       }
   }

更新 :

public class TypeNewsService : ITypeNewsService
   {
       private readonly ITypeNewsRepository _typeNewsRepository;
       private readonly IUnitOfWork _unitOfWork;
       public TypeNewsService(ITypeNewsRepository typeNewsRepository,
           IUnitOfWork unitOfWork)
       {
           _typeNewsRepository = typeNewsRepository;
           _unitOfWork = unitOfWork;
       }

       #region ITypeNewsService Member

       public void AddTypeNews(TypeNews typeNews)
       {
           _typeNewsRepository.Add(typeNews);
           SaveTypeNews();
       }

       public void DeleteTypeNews(int id)
       {
           _typeNewsRepository.DeleteById(id);
           SaveTypeNews();
       }

       public IEnumerable<TypeNews> GetTypeNewss()
       {
           var output = _typeNewsRepository.GetAll();
           return output;
       }

       public void SaveTypeNews()
       {
           _unitOfWork.Commit();
       }

       #endregion

   }

   public interface ITypeNewsService
   {
       void AddTypeNews(TypeNews typeNews);
       void DeleteTypeNews(int id);
       IEnumerable<TypeNews> GetTypeNewss();
       void SaveTypeNews();
   }

您的控制器是WebApi控制器,Autofac 的註冊與 MVC 註冊不同。WebApi 不使用DependencyResolver,因此您需要告訴 WebApi 專門使用 Autofac 解析器。

您需要將其添加到您的SetAutofacContainer程式碼中:

// Create the depenedency resolver.
var resolver = new AutofacWebApiDependencyResolver(container);

// Configure Web API with the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver = resolver;

有關更多資訊,請參閱https://code.google.com/p/autofac/wiki/WebApiIntegration

引用自:https://stackoverflow.com/questions/24992712