依赖项注入问题:System.NullReferenceException:';对象引用未设置为对象的实例。 [英] Dependecy Injection troubles: System.NullReferenceException: 'Object reference not set to an instance of an object.'
本文介绍了依赖项注入问题: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:';对象引用未设置为对象的实例。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文