Foo*_*ife 12 asp.net-mvc dependency-injection autofac asp.net-apicontroller
我一直在努力寻找,但却没有找到任何帮助.我哪里错了?我真的不知道该怎么办.我在下面写了所有细节.我尝试过但没有成功.
尝试创建"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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的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,
};
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
<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>
Run Code Online (Sandbox Code Playgroud)
Bootstrapper类:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
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();
}
Run Code Online (Sandbox Code Playgroud)
tra*_*max 18
您的控制器是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;
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅https://code.google.com/p/autofac/wiki/WebApiIntegration.
Viv*_*Dev 11
在我的情况下,原因是解析器找不到映射.也就是说,假设HomeController依赖于IDumb,解析器无法找到实现IDumb的Dumb的具体实现.
换句话说,错误消息
**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**
Run Code Online (Sandbox Code Playgroud)
完全是误导.
在我的情况下,我刚刚通过添加对Dumb类的项目的引用来解决.它应该是"没有找到IDumb的映射.".我不确定问题是否与NInject或MS有关.无论如何,我花了几个小时才找到它.
| 归档时间: |
|
| 查看次数: |
31896 次 |
| 最近记录: |