C# 使用[Inject]属性在依赖项注入上自动映射Null
我有一个类,它从数据库中获取一些数据,然后使用AutoMapper映射数据。然而,由于某些原因,mapper从未注入值,所以当我尝试使用mapper时,会得到一个NullReferenceExceptionC# 使用[Inject]属性在依赖项注入上自动映射Null,c#,dependency-injection,automapper,blazor,nullreferenceexception,C#,Dependency Injection,Automapper,Blazor,Nullreferenceexception,我有一个类,它从数据库中获取一些数据,然后使用AutoMapper映射数据。然而,由于某些原因,mapper从未注入值,所以当我尝试使用mapper时,会得到一个NullReferenceException public class SearchesEditReview { [注入] 公共IMapper映射程序{get;set;} 公共异步任务GetEditFromId(int id) { //无关代码 返回新的ViewEvent { 数据=timelineinfo.FirstOrDefault
public class SearchesEditReview
{
[注入]
公共IMapper映射程序{get;set;}
公共异步任务GetEditFromId(int id)
{
//无关代码
返回新的ViewEvent
{
数据=timelineinfo.FirstOrDefault(),
媒体=媒体,
//下一行中断,表示映射器为空
Subjects=mapper.Map(主题)
};
}
}
我的相关Startup.cs
看起来像:
public void配置服务(IServiceCollection服务)
{
//自动映射器配置
var mapperConfig=新的MapperConfiguration(mc=>
{
mc.AddProfile(新的MappingProfile());
});
AddHttpContextAccessor();
IMapper mapper=mapperConfig.CreateMapper();
服务。AddSingleton(映射器);
}
让我们重点关注SearchesEditReview的构造,它似乎无法正确绑定automapper属性,而它应该正确注册
您正在使用带有[Inject]
属性的绑定,但并不总是清楚它是如何工作的(至少对我来说是这样;有很多框架,它们的工作方式都有点不同)。因此,我倾向于使用构造函数注入模式:
public class SearchesEditReview
{
public SearchesEditReview(IMapper mapper) //dependencies here
{
//attach to properties
}
}
除了没有无参数构造函数的缺点之外,它还有两个优点:
您必须传递参数,这样就不会有歧义,更容易调试
您独立于DI框架。你很少用的
如前所述,对于.net Core,您可以为.net Core依赖项注入框架使用:
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjections:
然后像这样注册:
public void ConfigureServices(IServiceCollection services)
{
//...
//You'll need to pass in the assemblies containing your profiles,
//or the profiles itself
services.AddAutoMapper(typeof(YourProfile1),typeof(YourProfile2)); //etc
}
注意:有时使用的加载程序集扫描getAssembly
可能容易出错。由于这发生在启动时,因此可能尚未加载包含程序集的配置文件
有关更多详细信息,请参阅或
还要记住,您需要确保框架能够构造SearchesEditReview
,您不能将它注入到这样的类中。但是,您使用的语法在.razor
页面上运行良好。
请看
换个班。注意构造函数
public class SearchesEditReview
{
public SearchesEditReview(IMapper mapper)
{
this.mapper = mapper;
}
IMapper mapper { get; set; }
public async Task<ViewEvent> GetEditFromId(int id)
{
//unrelated code
return new ViewEvent
{
Data = timelineinfo.FirstOrDefault(),
Medias = media,
//The below line breaks, saying mapper is null
Subjects = mapper.Map<List<DBSubject>, List<ViewSubject>>(subjects)
};
}
}
docs.automapper.org/en/latest/Dependency injection.html#asp net核心使用构造函数注入。@inject指令和inject属性只能与Razor组件一起使用。不,映射器在AM.DI中是ServiceLifetime.Transient
,现在有一段时间了。而且getAssemblys
的东西显然容易出错,所以大多数时候只需传递定义概要文件的程序集就更容易了。好的一点,我在评论中补充了这一点,但更正了它。我想知道答案,既然类有了构造函数,那么创建该类实例的公认方法是什么?好吧,有几个选项:1)手动创建,使用新建(不推荐),2)在控制器中创建,默认情况下,这将起作用:只需将SearchesEditReview
添加到控制器构造函数3)从服务提供商处解决它。这应该会给你一些提示,或者搜索Razor和依赖注入,也请参见:如何使用构造函数创建SearchesEditReview
的实例?@Bubinga注入在控制器、Razor页面、中间件等中工作。在Razor页面中,你可以使用[Inject]属性。在控制器或中间件中,您只需将可注入项放入构造函数中,即可自动提供它们。@Bubinga例如,在.razor
页面中,如果您在控制器中[Inject]SearchesEditReview SearchesEditReview
则创建一个构造函数(如果它还没有构造函数),并将SearchesEditReview添加为参数。在我的例子中,注入系统将知道如何构造它。啊,这是有意义的。我刚试过,效果不错。谢谢:)
...
services.AddSingleton(mapper);
services.AddSingleton<SearchesEditReview>();