কীভাবে এএসপি.নেট কোরে অটোম্যাপার সেট আপ করবেন


254

আমি নেট থেকে অপেক্ষাকৃত নতুন, এবং আমি "পুরানো উপায়" শেখার পরিবর্তে। নেট নেটকে সামলানোর সিদ্ধান্ত নিয়েছি। আমি এখানে নেট কোরের জন্য অটোম্যাপার সেটআপ সম্পর্কে একটি বিশদ নিবন্ধ পেয়েছি , তবে কি কোনও নবজাতকের জন্য আরও সহজ ওয়াকথ্রু আছে?



কোর নতুন সংস্করণে জন্য (> v1 এ) @ Saineshwar এর উত্তর খুঁজে বার করো stackoverflow.com/a/53455699/833878
রবি

1
উদাহরণ সহ একটি সম্পূর্ণ উত্তর এই লিঙ্কটিতে ক্লিক করুন
Bahমান বাহরামপুর

উত্তর:


552

আমি এটি খুঁজে বের! বিশদটি এখানে:

  1. এর মাধ্যমে আপনার সমাধান প্রধান AutoMapper প্যাকেজ জুড়ুন NuGet
  2. এর মাধ্যমে আপনার সমাধান AutoMapper নির্ভরতা ইনজেকশন প্যাকেজ জুড়ুন NuGet

  3. ম্যাপিং প্রোফাইলের জন্য একটি নতুন ক্লাস তৈরি করুন। (আমি কল করা মূল সমাধান ডিরেক্টরিতে একটি শ্রেণি তৈরি করেছি MappingProfile.csএবং নীচের কোডটি যুক্ত করেছি a) আমি উদাহরণ হিসাবে একটি Userএবং UserDtoঅবজেক্ট ব্যবহার করব ।

    public class MappingProfile : Profile {
        public MappingProfile() {
            // Add as many of these lines as you need to map your objects
            CreateMap<User, UserDto>();
            CreateMap<UserDto, User>();
        }
    }
  4. তারপরে Startup.csনীচের প্রদর্শিত হিসাবে অটোম্যাপার কনফিগারেশন যুক্ত করুন :

    public void ConfigureServices(IServiceCollection services) {
        // .... Ignore code before this
    
       // Auto Mapper Configurations
        var mappingConfig = new MapperConfiguration(mc =>
        {
            mc.AddProfile(new MappingProfile());
        });
    
        IMapper mapper = mappingConfig.CreateMapper();
        services.AddSingleton(mapper);
    
        services.AddMvc();
    
    }
  5. কোডে ম্যাপযুক্ত অবজেক্টটি আহ্বান করতে নীচের মতো কিছু করুন:

    public class UserController : Controller {
    
        // Create a field to store the mapper object
        private readonly IMapper _mapper;
    
        // Assign the object in the constructor for dependency injection
        public UserController(IMapper mapper) {
            _mapper = mapper;
        }
    
        public async Task<IActionResult> Edit(string id) {
    
            // Instantiate source object
            // (Get it from the database or whatever your code calls for)
            var user = await _context.Users
                .SingleOrDefaultAsync(u => u.Id == id);
    
            // Instantiate the mapped data transfer object
            // using the mapper you stored in the private field.
            // The type of the source object is the first type argument
            // and the type of the destination is the second.
            // Pass the source object you just instantiated above
            // as the argument to the _mapper.Map<>() method.
            var model = _mapper.Map<UserDto>(user);
    
            // .... Do whatever you want after that!
        }
    }

আমি আশা করি এটি কাউকে ASP.NET কোর দিয়ে নতুন করে শুরু করতে সহায়তা করবে! আমি নেট নেটওয়ার্কে এখনও নতুন থাকায় আমি কোনও প্রতিক্রিয়া বা সমালোচনাকে স্বাগত জানাই!


3
লিস্টযুক্ত বিস্তারিত নিবন্ধটি, lostechies.com/jimmybogard/2016/07/20/… , Profileক্লাসগুলি কীভাবে অবস্থিত তা ব্যাখ্যা করে
কাইরেন জনস্টোন

22
@ থিয়েটজ আপনি এই দুটি ক্রিয়েটম্যাপ লাইনগুলিকে একটি .ReversMap () এর সাথে একত্রে ভাল করে মার্জ করতে পারেন either এটি মন্তব্য করতে পারে, তবে আমি এটি আরও স্বজ্ঞাত বলে মনে করি।
অ্যাস্ট্রাগগ্রান্ট

6
এটি "অটোম্যাপার ব্যবহার করে" যোগ করার কথা উল্লেখ করা পদক্ষেপ 3 তে সহায়ক হতে পারে; শীর্ষে যাতে এক্সটেনশন পদ্ধতিটি আমদানি করা হয়।
রক্লান

8
এটি নেট নেট ১.১ এর সাথে ঠিকঠাক কাজ করেছে, আমি একবার নেট নেট ২.০ এ আপগ্রেড করেছি। আমি মনে করি, আমার স্পষ্টভাবে লজিক প্রোফাইল শ্রেণীর সমাবেশটি নির্দিষ্ট করা দরকার। কীভাবে এটি সম্পাদন করা যায় তা নিয়ে এখনও গবেষণা চলছে। আপডেট: আহ উত্তরটি আপনার মন্তব্যে থাকে, আমাকে টাইপফুল ক্লাসটি পাস করতে হবে যা আমার প্রোফাইল। // Services.AddAutoMapper (টাইপফ (স্টার্টআপ)); // <- নতুন অটোম্যাপার সংস্করণটি এই স্বাক্ষরটি ব্যবহার করে
Esen

3
অটোম্যাপার ভি 8 এবং নির্ভরতা ইনজেকশন ভি 5-এ যুক্ত করা দরকার কেবলমাত্র পরিষেবাগুলি। অ্যাডআউটোম্যাপার (); স্টার্টআপ ক্লাসের কনফিগার সার্ভিস পদ্ধতিতে লাইন। আমার জন্য, এটি নির্ভরশীল শ্রেণীর পাঠাগার প্রকল্পগুলিতে প্রোফাইল ক্লাসগুলি সন্ধান করতে সক্ষম হয়েছিল।
stricq

68

ASP.NET কোর সহ অটোম্যাপার ব্যবহারের পদক্ষেপ।

পদক্ষেপ 1. অটোম্যাপার ইনস্টল করা x এক্সটেনশনগুলি ic মাইক্রোসফ্ট Dনিউজেট প্যাকেজ থেকে নির্ভরতা n

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 2. "ম্যাপিংস" নামের সাথে ম্যাপিংগুলি রাখার জন্য সমাধানে একটি ফোল্ডার তৈরি করুন।

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ ৩. ম্যাপিং ফোল্ডার যুক্ত করার পরে আমরা নামের সাথে একটি ক্লাস যুক্ত করেছি " ম্যাপিংপ্রফাইলে " এই নামটি অনন্য এবং বোঝার মতো ভাল কিছু করতে পারে।

এই শ্রেণিতে, আমরা সমস্ত ম্যাপিংগুলি বজায় রাখতে যাচ্ছি।

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 4. প্রারম্ভকালে "কনফিগার সার্ভিসগুলি" মাপার শুরু করা

স্টার্টআপ ক্লাসে, আমাদের প্রোফাইল তৈরি করতে হবে যা আমরা তৈরি করেছি এবং অটোম্যাপার পরিষেবাও নিবন্ধভুক্ত করতে হবে।

  Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());

  services.AddAutoMapper();

কনফিগার সার্ভিস পদ্ধতি দেখানোর জন্য কোড স্নিপেট যেখানে আমাদের অটোম্যাপার আরম্ভ এবং নিবন্ধকরণ করতে হবে।

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }


    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        // Start Registering and Initializing AutoMapper

        Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>());
        services.AddAutoMapper();

        // End Registering and Initializing AutoMapper

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    }}

পদক্ষেপ 5. আউটপুট পান।

ম্যাপিং ফলাফল পেতে আমাদের অটোম্যাপার.ম্যাপার.ম্যাপকে কল করতে হবে এবং সঠিক গন্তব্য এবং উত্সটি পাস করতে হবে।

AutoMapper.Mapper.Map<Destination>(source);

টুকিটাকি সংকেতলিপি

    [HttpPost]
    public void Post([FromBody] SchemeMasterViewModel schemeMaster)
    {
        if (ModelState.IsValid)
        {
            var mappedresult = AutoMapper.Mapper.Map<SchemeMaster>(schemeMaster);
        }
    }

12
আমি নিম্নলিখিত ত্রুটির পাবেন: 'Mapper' does not contain a definition for 'initialize'। আমি AutoMapper.Extensions.Microsoft.DependencyInjection
7.0.0

সুপার বিস্তারিত উত্তর। ধন্যবাদ জনাব.
রড হার্টজেল

1
আপনি যদি এএসপি.নেট কোর ৩.০ ব্যবহার করছেন তবে এই টিউটোরিয়ালটি পরীক্ষা করে দেখুন কীভাবে এএসপি.নেট কোর 3.0.০
tutexchange.com/how-to-set-up-automapper-in-asp-net-core-3-0- এ

44

আমি @ থুতজের উত্তরগুলি প্রসারিত করতে চাই - যথা এই লাইন:

// services.AddAutoMapper(typeof(Startup));  // <-- newer automapper version uses this signature.

অটোম্যাপ্পারে একটি বাগ রয়েছে ( সম্ভবত ) x (আমি। নেট কোর 2.0 ব্যবহার করছি)

এটি এই গিটহাব ইস্যুতে মোকাবেলা করা হয়েছে । অটোম্যাপারের প্রোফাইল বর্গ উত্তরাধিকার সূত্রে প্রাপ্ত আপনার ক্লাসগুলি যদি আপনার স্টার্টআপ ক্লাস হয় এমন সমাবেশের বাইরে উপস্থিত থাকে তবে আপনার অটোম্যাপার ইঞ্জেকশনটি দেখতে দেখতে সম্ভবত তারা নিবন্ধভুক্ত হবে না:

services.AddAutoMapper();

অটোম্যাপার প্রোফাইলগুলি অনুসন্ধান করার জন্য কোন অ্যাসেমব্লিশগুলি আপনি স্পষ্টভাবে নির্দিষ্ট না করে থাকেন।

এটি আপনার স্টার্টআপে এটি করা যেতে পারে on কনফিগার সার্ভিসেস:

services.AddAutoMapper(<assembies> or <type_in_assemblies>);

যেখানে " অ্যাসেমব্লিসি " এবং "টাইপ_ইন_সেম্বলিসগুলি" আপনার অ্যাপ্লিকেশনটিতে প্রোফাইল ক্লাস নির্দিষ্ট করা আছে সেই সমাবেশের দিকে নির্দেশ করে। উদাহরণ:

services.AddAutoMapper(typeof(ProfileInOtherAssembly), typeof(ProfileInYetAnotherAssembly));

আমি অনুমান করি (এবং আমি এই শব্দের উপর জোর দিয়েছি) যে প্যারামিটারলেস ওভারলোড ( গিটহাবের উত্স কোড ) অনুসরণের ফলে :

public static IServiceCollection AddAutoMapper(this IServiceCollection services)
{
     return services.AddAutoMapper(null, AppDomain.CurrentDomain.GetAssemblies());
}

আমরা ইতিমধ্যে JITed সমাবেশ ধারণকারী AutoMapper প্রোফাইলের যা হতে পারে বা সত্য হতে পারে না তারা শুধুমাত্র প্রয়োজন হলে (ইন আরো বিস্তারিত জানার jitted করছে থাকার CLR উপর নির্ভর এই Stackoverflow প্রশ্ন)।


5
অটোমাপ্পার এবং অ্যাসপনেটকোরের সর্বশেষ সংস্করণটির সঠিক উত্তরটি দেয়
জোশিত

1
এটি আমি উত্তরটি অটোম্যাপার 8.1 (সর্বশেষ সংস্করণ) এর সন্ধান
করছিলাম

30

থুতজের উত্তর এখানে খুব ভাল, আমি কেবল এটি যুক্ত করতে চাই:

যদি আপনি এর MapperConfigurationExpressionপরিবর্তে আপনার ম্যাপিং প্রোফাইলটিকে উত্তরাধিকার সূত্রে অনুমতি দেন তবে আপনি Profileনিজের ম্যাপিং সেটআপ যাচাই করার জন্য খুব সহজেই একটি পরীক্ষা যুক্ত করতে পারেন যা সর্বদা কার্যকর always

[Fact]
public void MappingProfile_VerifyMappings()
{
    var mappingProfile = new MappingProfile();

    var config = new MapperConfiguration(mappingProfile);
    var mapper = new Mapper(config);

    (mapper as IMapper).ConfigurationProvider.AssertConfigurationIsValid();
}

আমি একটি ত্রুটি পাচ্ছি: "অটোম্যাপার এক্সটেনশন নির্ভরতা ইনজেকশনটি এসপ নেট কোর ১.১ এর সাথে সঙ্গতিপূর্ণ নয়"। সাহায্য করুন!
রোহিত অরোরা

দেখে মনে হচ্ছে যে "যাচাইকরণ" এর সংজ্ঞাটি বিতর্কের জন্য রয়েছে। ম্যাপিং প্রতিরোধের জন্য নির্দিষ্ট বৈশিষ্ট্যগুলি ডিজাইন দ্বারা বাদ দিলে এটি ফুটে ওঠে।
জেরেমি হলভ্যাক্স

2
আপনি যদি কোনও মানচিত্রযুক্ত কোনও সম্পত্তি না চান তবে এটি দিয়ে সেট আপ করুন I এইভাবে, এটি আপনাকে প্রতিটি কেস পরিচালনা করার জন্য সক্রিয়ভাবে চিন্তা করতে বাধ্য করে - তা নিশ্চিত করে যে আপনি যখন পরিবর্তনগুলি করা হচ্ছে তখন আপনি স্টাফ এড়িয়ে যাবেন না। সুপার বাস্তব, আসলে। সুতরাং হ্যাঁ, যাচাই-পরীক্ষাটি অনেকেই উপলব্ধি না করেই একটি বৃহত সুরক্ষার নেট। এটি নির্বোধ নয়, তবে এটি প্রথম 90% যত্ন নেয়।
সাইস্তাদ

18

নেট কোর 2.2 / অটোম্যাপার 8.1.1 ডাব্লু / এক্সটেনশনস.আইডি 6.1.1 এর জন্য আমি এটিকে এটিকে (উপরের মতো সাদৃশ্যপূর্ণ তবে মনে হয় এটি ক্লিনার এর মতো সমাধান)।

ম্যাপিংপ্রোফাইল.সি ক্লাস তৈরি করুন এবং মানচিত্রের সাথে কনস্ট্রাক্টরকে পপুলেট করুন (আমি আমার সমস্ত ম্যাপিং ধরে রাখতে একটি ক্লাস ব্যবহারের পরিকল্পনা করছি)

    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<Source, Dest>().ReverseMap();
        }
    }

স্টার্টআপ.সগুলিতে, ডিআই-তে যুক্ত করতে নীচে যুক্ত করুন (অ্যাসেমব্লিং আর্গটি সেই শ্রেণীর জন্য যা আপনার ম্যাপিং কনফিগারগুলি রাখে, আমার ক্ষেত্রে এটি ম্যাপিংপ্রোফাইল শ্রেণি))

//add automapper DI
services.AddAutoMapper(typeof(MappingProfile));

কন্ট্রোলারে, এটি এমন কোনও ব্যবহার করুন যাতে আপনি অন্য কোনও ডিআই অবজেক্ট করেন

    [Route("api/[controller]")]
    [ApiController]
    public class AnyController : ControllerBase
    {
        private readonly IMapper _mapper;

        public AnyController(IMapper mapper)
        {
            _mapper = mapper;
        }

        public IActionResult Get(int id)
        {
            var entity = repository.Get(id);
            var dto = _mapper.Map<Dest>(entity);

            return Ok(dto);
        }
    }


2
আমি আপনার উত্তর পছন্দ। আমি মনে করি মোড়ানো MappingProfilesসঙ্গে new Type[]{}যেমন দেখানো এই উত্তর অপ্রয়োজনীয়।
অর্থ ওরিয়েন্টেড প্রোগ্রামার

10

আমার স্টার্টআপ.সগুলিতে (কোর ২.২, অটোম্যাপার 8.1.1)

services.AddAutoMapper(new Type[] { typeof(DAL.MapperProfile) });            

আমার ডেটা অ্যাক্সেস প্রকল্পে

namespace DAL
{
    public class MapperProfile : Profile
    {
        // place holder for AddAutoMapper (to bring in the DAL assembly)
    }
}

আমার মডেল সংজ্ঞা

namespace DAL.Models
{
    public class PositionProfile : Profile
    {
        public PositionProfile()
        {
            CreateMap<Position, PositionDto_v1>();
        }
    }

    public class Position
    {
        ...
    }

আপনি কেবল services.AddAutoMapper( typeof(DAL.MapperProfile) ); পরিবর্তে ব্যবহার করবেন না কেন services.AddAutoMapper(new Type[] { typeof(DAL.MapperProfile) });?
অর্থ ওরিয়েন্টেড প্রোগ্রামার

8

আমি প্রচুর উত্তর পছন্দ করি, বিশেষত @ সনেশ্বর এর উত্তর। আমি AutoMapper 9.0 এর সাথে নেট নেট 3.0 ব্যবহার করছি, সুতরাং আমি উত্তরটি আপডেট করার সময় অনুভব করছি।

আমার জন্য যা কাজ করেছিল তা ছিল স্টার্টআপ. কনফিগার সার্ভিসেস (...) পরিষেবাটি এইভাবে নিবন্ধ করুন:

    services.AddAutoMapper(cfg => cfg.AddProfile<MappingProfile>(), 
                               AppDomain.CurrentDomain.GetAssemblies());

আমি মনে করি @ সাইনেশ্বরের উত্তরগুলি নিখুঁত রাখে। তবে যদি কেউ আগ্রহী তবে আমার নিয়ামক কোডটি হ'ল:

[HttpGet("{id}")]
public async Task<ActionResult> GetIic(int id)
{
    // _context is a DB provider
    var Iic = await _context.Find(id).ConfigureAwait(false);

    if (Iic == null)
    {
        return NotFound();
    }

    var map = _mapper.Map<IicVM>(Iic);

    return Ok(map);
}

এবং আমার ম্যাপিং ক্লাস:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Iic, IicVM>()
            .ForMember(dest => dest.DepartmentName, o => o.MapFrom(src => src.Department.Name))
            .ForMember(dest => dest.PortfolioTypeName, o => o.MapFrom(src => src.PortfolioType.Name));
            //.ReverseMap();
    }
}

----- সম্পাদনা করুন -----

লুসিয়ান বারগাওয়ানুর মন্তব্যে লিঙ্কিত ডক্সগুলি পড়ার পরে, আমি মনে করি এই উত্তরটি কিছুটা পরিবর্তন করা ভাল।

প্যারামিটারলেস services.AddAutoMapper()(যার @ সাইনেশ্বর উত্তর ছিল) আর কাজ করে না (কমপক্ষে আমার জন্য)। তবে আপনি যদি নুগেট অ্যাসেম্বলি অটোম্যাপার ব্যবহার করেন x এক্সটেনশনগুলি ic মাইক্রোসফট D নির্ভরতা ইনজেকশন, ফ্রেমওয়ার্কটি অটোম্যাপার.প্রফিল (যেমন খনি, ম্যাপিংপ্রোফাইল) প্রসারিত সমস্ত শ্রেণিগুলি পরীক্ষা করতে সক্ষম হয়।

সুতরাং, আমার ক্ষেত্রে, ক্লাসটি একই নির্বাহী সমাবেশের অন্তর্ভুক্ত, পরিষেবা নিবন্ধকরণকে সংক্ষিপ্ত করা যেতে পারে services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(আরও একটি মার্জিত পদ্ধতির এই কোডিংয়ের সাথে প্যারামিটারলেস এক্সটেনশন হতে পারে)।

ধন্যবাদ, লুসিয়ান!



6

আমি অটোম্যাপার 6.1.1 এবং এসপ নেট কোর 1.1.2 ব্যবহার করছি।

সবার আগে, অটোম্যাপারের প্রোফাইল ক্লাস দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত প্রোফাইল ক্লাসগুলি সংজ্ঞায়িত করুন। আমি আইফ্রোফাইল ইন্টারফেস তৈরি করেছি যা খালি, উদ্দেশ্য কেবল এই ধরণের ক্লাসগুলি সন্ধান করা।

 public class UserProfile : Profile, IProfile
    {
        public UserProfile()
        {
            CreateMap<User, UserModel>();
            CreateMap<UserModel, User>();
        }
    }

এখন আলাদা ক্লাস তৈরি করুন যেমন ম্যাপিংস

 public class Mappings
    {
     public static void RegisterMappings()
     {            
       var all =
       Assembly
          .GetEntryAssembly()
          .GetReferencedAssemblies()
          .Select(Assembly.Load)
          .SelectMany(x => x.DefinedTypes)
          .Where(type => typeof(IProfile).GetTypeInfo().IsAssignableFrom(type.AsType()));

            foreach (var ti in all)
            {
                var t = ti.AsType();
                if (t.Equals(typeof(IProfile)))
                {
                    Mapper.Initialize(cfg =>
                    {
                        cfg.AddProfiles(t); // Initialise each Profile classe
                    });
                }
            }         
        }

    }

এখন এমটিসি কোর ওয়েব প্রোজেক্টে স্টার্টআপ সি ফাইলগুলিতে, কনস্ট্রাক্টরে ম্যাপিং ক্লাসটি কল করুন যা অ্যাপ্লিকেশন লোড হওয়ার সময়ে সমস্ত ম্যাপিং শুরু করবে।

Mappings.RegisterMappings();

আপনি কেবল প্রোফাইল ক্লাস থেকে একটি সাবক্লাস তৈরি করতে পারেন, এবং যখন প্রোগ্রামটি পরিষেবাগুলি চালিত হয় Aআডোআউটম্যাপার (); কোডগুলির লাইন স্বয়ংক্রিয়ভাবে এগুলি তাদের জানবে।
isaeid

আমি অটোম্যাপ্পার ব্যবহার করি না বলে মনে করি না ic
গ্রেগ গাম

5

এএসপি.নেট কোর (২.০+ এবং ৩.০ ব্যবহার করে পরীক্ষা করা হয়েছে) এর জন্য, যদি আপনি উত্স ডকুমেন্টেশনটি পড়তে পছন্দ করেন: https://github.com/AutoMapper/AutoMapper.Extensions.Mic Microsoft.D dependencyInication/blob/master/README.md

অন্যথায় এই 4 টি পদক্ষেপ অনুসরণ করে:

  1. অটোম্যাপার ইনস্টল করুন x এক্সটেনশনগুলি ic মাইক্রোসফট D ডিপেন্ডেন্সিআইজেক্ট নুগেট থেকে।

  2. কেবল কিছু প্রোফাইল ক্লাস যুক্ত করুন।

  3. তারপরে আপনার স্টার্টআপ। সি ক্লাসে নীচে যুক্ত করুন। services.AddAutoMapper(OneOfYourProfileClassNamesHere)

  4. তারপরে আপনার কন্ট্রোলারগুলিতে বা আপনার যেখানেই প্রয়োজন দরকার কেবল তেমন ইনজেক্ট করুন:

public class EmployeesController {

    private readonly IMapper _mapper;

    public EmployeesController(IMapper mapper){

        _mapper = mapper;
    }

এবং যদি আপনি প্রকল্পটি এটি এখনই সহজভাবে ব্যবহার করতে চান:

var customers = await dbContext.Customers.ProjectTo<CustomerDto>(_mapper.ConfigurationProvider).ToListAsync()

4

অটোম্যাপার 9.0.0 এর জন্য:

public static IEnumerable<Type> GetAutoMapperProfilesFromAllAssemblies()
    {
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            foreach (var aType in assembly.GetTypes())
            {
                if (aType.IsClass && !aType.IsAbstract && aType.IsSubclassOf(typeof(Profile)))
                    yield return aType;
            }
        }
    }

MapperProfile:

public class OrganizationProfile : Profile
{
  public OrganizationProfile()
  {
    CreateMap<Foo, FooDto>();
    // Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)
  }
}

আপনার শুরুতে:

services.AddAutoMapper(GetAutoMapperProfilesFromAllAssemblies()
            .ToArray());

নিয়ামক বা পরিষেবায়: ম্যাপার ইনজেকশন করুন:

private readonly IMapper _mapper;

ব্যবহার:

var obj = _mapper.Map<TDest>(sourceObject);

4

এসপ নেট কোরের সর্বশেষতম সংস্করণগুলিতে আপনার নিম্নলিখিত সূচনাটি ব্যবহার করা উচিত:

services.AddAutoMapper(typeof(YourMappingProfileClass));

2

অটোম্যাপ্পার সহ অ্যাস্পেট নেট কোর ২.২

public class MappingProfile : Profile
{
  public MappingProfile()
  {
      CreateMap<Domain, DomainDto>();
  }
}

স্টার্টআপ। সি

services.AddAutoMapper(typeof(List.Handler));

1

আরভ সিনস্টাড যা পরীক্ষার জন্য উল্লেখ করেছে তাতে যুক্ত করতে। যদি আপনি যে কারণেই আমার মতো হন এবং থুতজ সমাধানে প্রদত্ত উত্তরাধিকার কাঠামো বজায় রাখতে চান তবে আপনি ম্যাপার কনফিগারেশনটি এভাবে সেট আপ করতে পারেন:

var mappingProfile = new MappingProfile();
var config = new MapperConfiguration(cfg =>
{
    cfg.AddProfile(mappingProfile);
});
var mapper = new Mapper(config);

আমি নুনিতে এটি করেছি।


1

services.AddAutoMapper (); আমার জন্য কাজ করেনি। (আমি Asp.Net কোর 2.0 ব্যবহার করছি)

নীচে হিসাবে কনফিগার করার পরে

   var config = new AutoMapper.MapperConfiguration(cfg =>
   {                 
       cfg.CreateMap<ClientCustomer, Models.Customer>();
   });

মাপারটি আইপ্যাপার ম্যাপার = কনফিগারেশন তৈরি করুন (ক্রিয়েটম্যাপার);

এবং একটি সিঙ্গলটন পরিষেবাদি হিসাবে পরিষেবাগুলিতে ম্যাপার অবজেক্ট যুক্ত করুন A অ্যাডসিংলেটন (ম্যাপার);

এইভাবে আমি নিয়ামকটিতে একটি ডিআই যুক্ত করতে সক্ষম

  private IMapper autoMapper = null;

  public VerifyController(IMapper mapper)
  {              
   autoMapper = mapper;  
  }

এবং আমি আমার ক্রিয়া পদ্ধতিতে নীচে হিসাবে ব্যবহার করেছি

  ClientCustomer customerObj = autoMapper.Map<ClientCustomer>(customer);

হাই @ ওয়েঙ্ক্যাট আপনার সম্ভবত আপনার প্রকল্পে অটোম্যাপার.এক্সটেনশনগুলি.মাইক্রোসফট.ডপেনডেন্সিআইজেকশন প্যাকেজ যুক্ত করার দরকার ছিল
ডালক্যাম

-1

থুতজ উত্তর সম্পর্কে, কন্ট্রোলার কনস্ট্রাক্টরে আইএমপ্পার ম্যাপার প্যারামিটার নির্দিষ্ট করার দরকার নেই ।

আপনি কোডের যে কোনও স্থানে স্থির সদস্য হিসাবে ম্যাপার ব্যবহার করতে পারেন।

public class UserController : Controller {
   public someMethod()
   {
      Mapper.Map<User, UserDto>(user);
   }
}

11
তবে স্ট্যাটিকস কি কিছুটা অ্যান্টি-টেস্টেবল, না?
স্কট ফ্রেলে

3
হাঁ। এটি অনেক ক্ষেত্রে কাজ করবে তবে পরীক্ষায় এই পদ্ধতিটি চালানোর সময় যদি আপনার কাছে কোনও কনফিগার ম্যাপিং না থাকে তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে (এবং এভাবে ভুল কারণে পরীক্ষায় ব্যর্থ হবে)। ইনজেকশনের সাহায্যে IMapperআপনি এটি উপহাস করতে পারেন এবং উদাহরণস্বরূপ, প্রদত্ত পরীক্ষার জন্য এটি অপ্রাসঙ্গিক হলে কেবল এটিকে শূন্য করে তুলুন।
Systad
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.