J'ai cherché longtemps et durement mais je n'ai rien trouvé qui puisse encore aider. Où vais-je mal? Je ne sais vraiment pas quoi faire. J'ai écrit tous les détails ci-dessous. J'ai essayé et n'ai pas réussi.
Une erreur s'est produite lors de la tentative de création d'un contrôleur de type 'TypeNewsController'. Assurez-vous que le contrôleur a un constructeur public sans paramètre.
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();
}
}
mon apicontroller:
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,
};
}
}
erreur :
<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>
Classe d'amorçage:
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));
}
}
mettre à jour :
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();
}
Votre contrôleur est un contrôleur WebApi
et l'enregistrement pour Autofac diffère de l'enregistrement MVC. WebApi n'utilise pas DependencyResolver
, vous devez donc indiquer à WebApi d'utiliser le résolveur Autofac de manière spécifique.
Vous devrez ajouter ceci à votre code SetAutofacContainer
:
// Create the depenedency resolver.
var resolver = new AutofacWebApiDependencyResolver(container);
// Configure Web API with the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
Voir https://code.google.com/p/autofac/wiki/WebApiIntegration pour plus d'informations.
Dans mon cas, la raison était que le résolveur ne pouvait pas trouver de mappage. En d'autres termes, supposons que HomeController ait une dépendance à IDumb, le résolveur ne trouve pas d'implémentation concrète de Dumb implémentant IDumb.
En d'autres termes, le message d'erreur
**No parameterless constructor defined for this object
An error occurred when trying to create a controller of type 'ToDoListT1.WebApp.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor**
est complètement trompeur.
Dans mon cas, je viens de résoudre en ajoutant une référence au projet de la classe Dumb. Cela aurait dû être quelque chose comme "Aucune cartographie pour IDumb n'a pu être trouvée". Je ne sais pas si le problème vient de NInject ou de MS. Quoi qu'il en soit, cela m'a pris des heures pour le découvrir.
Assurez-vous que vous appelez le même type d'appel, je veux dire, obtenir, publier, mettre, et quel type vous avez dans la méthode du contrôleur.
Et devez-vous ajouter votre référentiel valide à NijectConfig.cs pour le contrôleur.
kernel.Bind <[iRepo]> (). À <[Repo]> (). InRequestScope ();