Custom Module Issue in Extension on cart line item and order line Item Field

Hi
I have created custom module to extend the line item in order line item and created 2nd custom module to extend the line Item in cart now i am able to save that field value of cart line item in database but when i am placing order createOrderFromCart api gets called its not converting my new field of cart lineitem to order lineItem i have override toOrderModel also and with container i have register in module.cs

This is the code which i am using to override ToOrderModel

public class NBCustomerOrderBuilder : CustomerOrderBuilder
{
private readonly ICustomerOrderService _customerOrderService;

    public NBCustomerOrderBuilder(ICustomerOrderService customerOrderService) : base(customerOrderService)
    {
        _customerOrderService = customerOrderService;
    }


    protected override LineItem ToOrderModel(VirtoCommerce.CartModule.Core.Model.LineItem lineItem)
    {
        var result = base.ToOrderModel(lineItem) as NBCustomerOrderLineItem;

        var cartLineItem2 = lineItem as NB.CartModule.Core.Models.NBCartLineItem;
        if (cartLineItem2 != null)
        {
            result.PrescriptionId = cartLineItem2.PrescriptionId;
        }
        return result;
    }
}

This is my module.cs where i have registered

public class Module : IModule
{
public ManifestModuleInfo ModuleInfo { get; set; }
private readonly IUnityContainer _container;
public Module()
{
_container = new UnityContainer();
}

    public void Initialize(IServiceCollection serviceCollection)
    {
        // database initialization
        AbstractTypeFactory<OrderLineItem>.OverrideType<OrderLineItem, NBCustomerOrderLineItem>();
        
        AbstractTypeFactory<OrderLineItemEntity>.OverrideType<OrderLineItemEntity, NBCustomerOrderLineItemEntity>();

        var configuration = serviceCollection.BuildServiceProvider().GetRequiredService<IConfiguration>();
        var connectionString = configuration.GetConnectionString("VirtoCommerce.OrderModuleModule") ?? configuration.GetConnectionString("VirtoCommerce");
        serviceCollection.AddDbContext<NBOrderDbContext>(options => options.UseSqlServer(connectionString));
        serviceCollection.AddDbContext<NotesDbContext>(options => options.UseSqlServer(connectionString));
        serviceCollection.AddTransient<INotesService, NotesService>();
        _container.RegisterType<CustomerOrderBuilder, NBCustomerOrderBuilder>();
        serviceCollection.AddTransient<IOrderRepository, NBOrderRepository>();
        serviceCollection.AddTransient<INotesRepository, NotesRepository>();
        serviceCollection.AddTransient<Func<INotesRepository>>(provider =>
            () => provider.CreateScope().ServiceProvider.GetRequiredService<INotesRepository>());
    }

public void PostInitialize(IApplicationBuilder appBuilder)
{
// register settings
var settingsRegistrar = appBuilder.ApplicationServices.GetRequiredService();
settingsRegistrar.RegisterSettings(ModuleConstants.Settings.AllSettings, ModuleInfo.Id);

        // register permissions
        var permissionsProvider = appBuilder.ApplicationServices.GetRequiredService<IPermissionsRegistrar>();
        permissionsProvider.RegisterPermissions(ModuleConstants.Security.Permissions.AllPermissions.Select(x =>
            new Permission()
            {
                GroupName = "OrderModuleModule",
                ModuleId = ModuleInfo.Id,
                Name = x
            }).ToArray());

        // Ensure that any pending migrations are applied
        using var serviceScope = appBuilder.ApplicationServices.CreateScope(); 
        
            using (var dbContext = serviceScope.ServiceProvider.GetRequiredService<NBOrderDbContext>())
            {
                dbContext.Database.EnsureCreated();
                dbContext.Database.Migrate();
            }
            using (var dbContext = serviceScope.ServiceProvider.GetRequiredService<NotesDbContext>())
            {
                dbContext.Database.EnsureCreated();
                dbContext.Database.Migrate();
            }
        }

Do we need to override initialize method i have register in existing initialize in module.cs ?

Hi
This issue is solved actually i did register using container but it worked when i register using serviceCollection.AddTransient<ICustomerOrderBuilder, NBCustomerOrderBuilder>();

Thanks

1 Like

Thank you for the feedback.