12

私は長く懸命に検索しましたが、まだ役立つものは何も見つかりませんでした. どこが間違っていますか?私は本当に何をすべきかわかりません。以下にすべての詳細を書きました。私は試しましたが、成功しませんでした。

タイプ '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();
        }
    }

私の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,
            };
        }
    }

エラー :

<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();
    }
4

4 に答える 4

19

コントローラーはWebApiコントローラーであり、Autofac の登録は MVC 登録とは異なります。WebApi は を使用しないためDependencyResolver、特に Autofac リゾルバーを使用するように WebApi に指示する必要があります。

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を参照してください。

于 2014-07-28T11:19:35.020 に答える
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**

は完全に誤解を招くものです。

私の場合、Dumb クラスのプロジェクトへの参照を追加することで解決しました。「IDumb のマッピングが見つかりませんでした。」のようなものである必要があります。問題が NInject にあるのか MS にあるのかわかりません。とにかく、これを見つけるのに何時間もかかりました。

于 2014-11-04T10:53:12.817 に答える
0

同じ呼び出しタイプ、つまり、Get、Post、Put、およびコントローラーメソッドにある種類を呼び出していることを確認してください。

また、コントローラーの NijectConfig.cs に有効なリポジトリを追加する必要がありますか。

kernel.Bind<[iRepo]>().To<[Repo]>().InRequestScope();

于 2016-04-18T16:14:23.237 に答える
-5

コントローラーの場合、パラメーターのないコンストラクターが必要です。パラメーター化されたコンストラクターを使用する場合は、以下のようなコードを使用してください。

TypeNewsService クラスのオブジェクトを渡す

private readonly ITypeNewsService _typeNewsService;
public TypeNewsController():this(new TypeNewsService ())
{
} 
public TypeNewsController(ITypeNewsService typeNewsService)
{
   _typeNewsService = typeNewsService;
}
于 2014-07-28T10:19:17.700 に答える