首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >依赖注入问题: System.NullReferenceException:“未将对象引用设置为对象的实例。”

依赖注入问题: System.NullReferenceException:“未将对象引用设置为对象的实例。”
EN

Stack Overflow用户
提问于 2021-08-13 15:39:27
回答 1查看 79关注 0票数 0

好的,我正在做一个Api,尝试使用DI。

我的控制器:

代码语言:javascript
运行
复制
 [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");
            }
        }
    }

和我的服务的代码:

代码语言:javascript
运行
复制
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;
            }

        }
    }

当我的代码行上升时

代码语言:javascript
运行
复制
 var company = await _repository.Company.GetById(int.Parse(company.Id))

我得到了错误

代码语言:javascript
运行
复制
System.NullReferenceException: 'Object reference not set to an instance of an object.'

下面是我的others类:

我的工厂:

代码语言:javascript
运行
复制
 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:

代码语言:javascript
运行
复制
 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中:

代码语言:javascript
运行
复制
 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的实现是:

代码语言:javascript
运行
复制
 public class ServiceWrapper : IServiceWrapper
    {
        private ITerminalService _terminal;

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

RepositoryWrapper的实现是:

代码语言:javascript
运行
复制
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;
            }
        }
    }

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

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-08-13 16:55:43

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

代码语言:javascript
运行
复制
var company = await _repository.Company.GetById(int.Parse(company.Id));

您正在创建/获取一个名为company的对象,同时已经传入了一个名为company的对象,您不能在同一作用域中有两个同名的变量或对象。将其中一个对象从company重命名为其他名称。

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

代码语言:javascript
运行
复制
var newCompany = await _repository.Company.GetById(int.Parse(company.Id));

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

代码语言:javascript
运行
复制
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    
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68775058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档