【问题标题】:Run Nopcommerce on console application在控制台应用程序上运行 Nopcommerce
【发布时间】:2021-10-25 16:25:49
【问题描述】:

我想将 NopCommerce 库用于控制台项目(用于迁移数据传输)。 我创建了一个控制台项目并将基础库(Nop.Core、Nop.Data、Nop.Service、Nop.Web.Freamework)添加到它,我还复制了 App_Data 文件夹。 我也使用 Class Startup.cs 来运行项目

namespace Nop.Console
{
    class Program
    {
        static void Main(string[] args)
        {
            using var host = Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
    .ConfigureWebHostDefaults(webBuilder => webBuilder
        .ConfigureAppConfiguration(config =>
        {
            config
                .AddJsonFile(NopConfigurationDefaults.AppSettingsFilePath, true, true)
                .AddEnvironmentVariables();
        })
        .UseStartup<Startup>())
    .Build();

            var engine = EngineContext.Create();
            var cs = engine.Resolve<ICategoryService>();

            System.Console.WriteLine("Hello World!");
        }
    }
}

但是engine.Resolve(); return null;

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc .net-core nopcommerce


    【解决方案1】:

    我不能 100% 确定这是否是最佳解决方案,但至少适用于 NopCommerce 4.40.4。我的控制台应用程序中的代码如下:

    /// <summary>
    /// EngineContextInitializer
    /// </summary>
    public static class EngineContextInitializer
    {
        /// <summary>
        /// Runs this instance.
        /// </summary>
        public static async Task<IHost> RunAsync()
        {
            string[] args = Array.Empty<string>();
            var host = Host.CreateDefaultBuilder(args)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder => webBuilder
                    .ConfigureAppConfiguration(config =>
                    {
                        config
                            .AddJsonFile(NopConfigurationDefaults.AppSettingsFilePath, true, true)
                            .AddEnvironmentVariables();
                    })
                    .UseStartup<Startup>())
                .Build();
    
            //start the program, a task will be completed when the host starts
            await host.StartAsync();
            return host;
        }
    }
    

    EngineContextInitializer 的用法如下:

    private async Task GetProductById(int id)
    {
        using var host = await EngineContextInitializer.RunAsync();
        IEngine engine = EngineContext.Current;
        var productService = engine.Resolve<IProductService>();
        var product = await productService.GetProductByIdAsync(id);
        await host.StopAsync();
    }
    

    那么,您的代码和我的代码有何不同? 我正在运行代码:

    await host.StartAsync();
    

    最重要的是,我在从 IProductService 获得产品后处置 IHost。 就行了就是区别:

    var host = Host.CreateDefaultBuilder(args)
    

    还有一件事,你不需要调用EngineContext.Create(),因为如果你检查类和当前getter,你会看到下面的代码:

    /// <summary>
        /// Gets the singleton Nop engine used to access Nop services.
        /// </summary>
        public static IEngine Current
        {
            get
            {
                if (Singleton<IEngine>.Instance == null)
                {
                    Create();
                }
    
                return Singleton<IEngine>.Instance;
            }
        }
    

    请不要忘记释放 IHost,因为它实现了 IDisposable 以避免内存泄漏。

    免责声明:我不是 NopCommerce 开发团队的一员,使用风险自负。请关注 NopCommerce 官方文档或在其网站(文档、论坛或 GitHub)上对该主题的回复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2019-01-30
      • 2013-02-11
      相关资源
      最近更新 更多