Почему хранилище пустое? - PullRequest
0 голосов
/ 24 января 2019

Я делаю API, и я делаю вызовы API.Я создал хранилище с именем IPartnerRepositoryКогда я запускаю мой вызов, он выдает ошибку nullexception.Когда я отлаживаю свой код, я вижу, что IPartnerRepository равно нулю.Моя визуальная студия не показывает никаких ошибок или опечаток.Почему моя программа не может найти этот репозиторий?Почему это ноль?

Это мой код:

public IPartnerRepository PartnerRepository { get; set; } // = null

[RequiresAnyRole(Roles.superadmin, Roles.admin)]
public async Task<PartnerListResponse> Get(PartnerListRequest request)
{
   var items = await PartnerRepository.GetAllAsync();
   return new PartnerListResponse
   {
      Items = items
   };
}

IPartnerRepository

using System;
using DTO = Ringdesk.Api.ServiceModel.DTO;

namespace Ringdesk.Api.ServiceModel.Interfaces
{
   public interface IPartnerRepository : IDtoRepository<DTO.Partner, 
      DTO.PartnerForInsert, DTO.PartnerForUpdate>
   {
   }
}

Partner.cs

using ServiceStack.Model;
using Ringdesk.Api.ServiceModel.Attributes;

namespace Ringdesk.Api.ServiceModel.DTO
{
    public class Partner : IHasId<int>
    {
        public int Id { get; set; }
        public string Guid { get; set; }
        [PropertyValue("name")]
        public string Name { get; set; }
    }

    public class PartnerForUpdate : IHasId<int>
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class PartnerForInsert
    {
        public string Name { get; set; }    
    }
}

the working code with customers

the partners code that goes wrong

Startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ServiceStack;
using Ringdesk.Api.Web.Jobs;
using NLog.Extensions.Logging;
using NLog.Web;

namespace Ringdesk.Api.Web
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddOrchardCms();
            //services.AddMvc();
        }

        public class StartupSettings
        {
            public bool RunJobs { get; set; }
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime)
        {
            var startupSettings = Configuration.GetSection("startupSettings").Get<StartupSettings>();

            if (startupSettings == null || startupSettings.RunJobs)
            {
                var quartz = new QuartzSetup();
                lifetime.ApplicationStarted.Register(quartz.Start);
                lifetime.ApplicationStopping.Register(quartz.Stop);
            }

            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddNLog();
            env.ConfigureNLog("nlog.config");
            loggerFactory.AddDebug();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            var appSettings = new NetCoreAppSettings(Configuration);
            app.UseServiceStack(new AppHost(appSettings));
            app.UseOrchardCore();

            //app.UseMvc(routes =>
            //      {
            //        routes.MapRoute(
            //            name: "default",
            //            template: "{controller=Home}/{action=Index}/{id?}");
            //      });
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Добавив PartnerRepository в сервисный модуль, я исправил его!

container.RegisterAs<PartnerRepository, IPartnerRepository>();
container.Register<IDtoRepository<Db.PartnerProperty, Db.PartnerProperty, Db.PartnerProperty>>(c =>
{
   var repository = new DtoRepository<Db.PartnerProperty, Db.PartnerProperty, Db.PartnerProperty, Db.PartnerProperty>();
   c.AutoWire(repository);
   return repository;
});

Это уже существует для CustomerRepository

Как @Croxy сказал, что я забыл присвоить значение для CustomerRepository внутри ServiceModule

0 голосов
/ 24 января 2019

Это ошибка времени выполнения, вызванная логической ошибкой.Visual Studio жалуется на ошибки компилятора.

Есть некоторые инструменты, такие как ReSharper, которые дают дружественные для разработчиков отзывы для разработчиков при кодировании, такие, что variable may be null, однако вы не можете ожидать от Visual Studio или любой другой среды разработки / инструментавсегда находить и давать вам советы по поводу логических ошибок / ошибок времени выполнения.

В вашем случае эта проблема возникает из-за того, что вы объявили public IPartnerRepository PartnerRepository { get; set; }, но никогда не устанавливали его для экземпляра.

Создание экземпляра может быть выполнено несколькими способами, но самым простым и распространенным способом является инициализация конструктора

class Something
{
     Something()
     {
          PartnerRepository = new PartnerRepository(....);
     }

     // then your methods here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...