依赖项注入问题:System.NullReferenceException:'对象引用未设置为对象的实例。 [英] Dependecy Injection troubles: System.NullReferenceException: 'Object reference not set to an instance of an object.'

查看:0
本文介绍了依赖项注入问题:System.NullReferenceException:'对象引用未设置为对象的实例。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,我正在创建Api,正在尝试使用DI。

我的控制器:

 [Route("api/[controller]")]
    [ApiController]
    public class TerminalsController : ControllerBase
    {
        private readonly IServiceWrapper _service;

        public TerminalsController(IServiceWrapper service)
        {
            _service = service;
        }

        [HttpPost]
        public async Task<ActionResult> Post([FromBody] Message object)
        {
            try
            {

                Result result = await _service.Terminal.UpsertInfo(ternminalObject);

                if (result.shopId != -1 || result.deviceId != -1 || result.companyId != -1)
                {
                    return Ok(result);
                }
                else
                {
                    return BadRequest("Can not save info from session on database");
                }
            }
            catch (Exception ex)
            {
                return StatusCode(500, "Internal server error");
            }
        }
    }

和我的服务代码:

public class TerminalService : ITerminalService
    {
        private readonly IRepositoryWrapper _repository;

        public TerminalService(IRepositoryWrapper repository) 
        {
            _repository = repository;
        }

        public async Task<Result> UpsertInfo(company company)
        {
            try
            {
                var company = await _repository.Company.GetById(int.Parse(company.Id))

                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

当我的代码上升行时

 var company = await _repository.Company.GetById(int.Parse(company.Id))

我收到错误

System.NullReferenceException: 'Object reference not set to an instance of an object.'

下面是我的Other类:

我的工厂:

 public class DbClientFactory<T>
    {
        private static Lazy<T> _factoryLazy = new Lazy<T>(
            () => (T)FormatterServices.GetUninitializedObject(typeof(T)),
            LazyThreadSafetyMode.ExecutionAndPublication);

        public static T Instance
        {
            get
            {
                return _factoryLazy.Value;
            }
        }
    }

工厂安装服务和存储库。

这是我的StartUp.cs:

 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            SqlHelper.connectionString = Environment.GetEnvironmentVariable("CONNECTION_STRING");
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.ConfigureCors();
            services.AddMvc();
            services.ConfigureServiceWrapper();
            services.ConfigureRepositoryWrapper();
            services.AddControllers().AddNewtonsoftJson();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseStaticFiles();
            app.UseCors("CorsPolicy");
            app.UseForwardedHeaders(new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.All
            });

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

ConfigureRepositoryWrapper和ConfigureServiceWrapper位于ServiceExtensions.cs:

 public static class ServiceExtensions
    {
        public static void ConfigureCors(this IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder.AllowAnyOrigin()
                    .AllowAnyMethod());
            });
        }
        public static void ConfigureRepositoryWrapper(this IServiceCollection services)
        {
            services.AddScoped<IRepositoryWrapper, RepositoryWrapper>();
        }
        public static void ConfigureServiceWrapper(this IServiceCollection services)
        {
            services.AddScoped<IServiceWrapper, ServiceWrapper>();
        }
    }

ServiceWrapper的实现为:

 public class ServiceWrapper : IServiceWrapper
    {
        private ITerminalService _terminal;

        public ITerminalService Terminal {
            get
            {
                if (_terminal == null)
                {
                    _terminal = DbClientFactory<TerminalService>.Instance;
                }
                return _terminal;
            }
        }
    }

RepositoryWrapper的实现是:

public class RepositoryWrapper : IRepositoryWrapper
    {
        private IDeviceRepository _device;
        private IShopRepository _shop;
        private ICompanyRepository _company;
        public IDeviceRepository Device
        {
            get
            {
                if (_device == null)
                {
                    _device = DbClientFactory<DeviceRepository>.Instance;
                }
                return _device;
            }
        }

        public IShopRepository Shop
        {
            get
            {
                if (_shop == null)
                {
                    _shop = DbClientFactory<ShopRepository>.Instance;
                }
                return _shop;
            }
        }

        public ICompanyRepository Company {
            get {
                if (_company == null)
                {
                    _company = DbClientFactory<CompanyRepository>.Instance;
                }
                return _company;
            }
        }
    }

我真的不知道这里出了什么问题...

谢谢!

推荐答案

您收到此错误,因为company.Id不存在。

var company = await _repository.Company.GetById(int.Parse(company.Id));
您正在创建/获取名为company的对象,同时已传入名为company的对象,不能在同一作用域中有两个同名的变量或对象。将其中一个对象从company重命名为其他名称。

此外,您可能没有在参数中传递对象,您可能传递的是NULL,这是company.Id不存在的原因。检查您要传递的值,然后重命名其中一个项目。

var newCompany = await _repository.Company.GetById(int.Parse(company.Id));

如果异常发生在_repository,原因是您试图将依赖项传递到非服务类。要修复它,请将依赖项传递到控制器,然后在初始化TerminalService时只需传递_repository。还要确保_service.Terminal已实例化。

public class TerminalsController : ControllerBase
{
     private readonly IServiceWrapper _service;
     private readonly IRepositoryWrapper _repository;

    public TerminalsController(IServiceWrapper service, IRepositoryWrapper repository)
    {
         _service = service;
         _repository = repository;
    }

    [HttpPost]
    public async Task<ActionResult> Post([FromBody] Message object)
    {
        _service.Terminal = new TerminalService(_repository);
        Result result = await _service.Terminal.UpsertInfo(ternminalObject);

        //remaining code    
    }
}

这篇关于依赖项注入问题:System.NullReferenceException:&#39;对象引用未设置为对象的实例。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆