Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用[Inject]属性在依赖项注入上自动映射Null_C#_Dependency Injection_Automapper_Blazor_Nullreferenceexception - Fatal编程技术网

C# 使用[Inject]属性在依赖项注入上自动映射Null

C# 使用[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

我有一个类,它从数据库中获取一些数据,然后使用AutoMapper映射数据。然而,由于某些原因,mapper从未注入值,所以当我尝试使用mapper时,会得到一个NullReferenceException

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>();