2

使用 NopCommerce 3.8。

我创建了一个新的 Misc 插件。目的是运行一个任务,它可以安静地调用我的 web api 来获取数据。

以下是我的代码:

插件类

public class MereSyncPlugin : BasePlugin, IMiscPlugin
{
    private MereSyncObjectContext _context;
    private IScheduleTaskService _schedualTaskService;

    public MereSyncPlugin(MereSyncObjectContext context, IScheduleTaskService schedualTaskService)
    {
        _context = context;
        _schedualTaskService = schedualTaskService;
    }

    public void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues)
    {
        actionName = "";
        controllerName = "";
        routeValues = new RouteValueDictionary()
        {
            { "Namespaces", "Nop.plugin.Misc.MereSync.Controllers" },
            { "area", null }
        };   
    }

    public override void Install()
    {
        //TODO: add more
        _schedualTaskService.InsertTask(new Nop.Core.Domain.Tasks.ScheduleTask()
        {
            Enabled = true,
            Name = "Product Sync",
            Seconds = 3600,
            StopOnError = false,
            Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync"
        });

        //_context.Install();
        base.Install();
    }

    public override void Uninstall()
    {
        Nop.Core.Domain.Tasks.ScheduleTask task = _schedualTaskService.GetTaskByType("Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync");

        if (task != null)
            _schedualTaskService.DeleteTask(task);

        //_context.Uninstall();
        base.Uninstall();
    }
}

对象上下文类(虽然此时没有设置所以注释掉了一些部分)

public class MereSyncObjectContext : DbContext, IDbContext
{
    public bool ProxyCreationEnabled
    {
        get
        {
            throw new NotImplementedException();
        }

        set
        {
            throw new NotImplementedException();
        }
    }

    public bool AutoDetectChangesEnabled
    {
        get
        {
            throw new NotImplementedException();
        }

        set
        {
            throw new NotImplementedException();
        }
    }

    public MereSyncObjectContext(string nameOrConnectionString) : base(nameOrConnectionString)
    {

    }

    /*protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //TODO: insert ALL model MAPPINGS!!!!
        //modelBuilder.Configurations.Add(new insertnewmap());
        base.OnModelCreating(modelBuilder);
    }*/

    public string CreateDatabaseInstallationScript()
    {
        return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript();
    }

    public void Install()
    {
        Database.SetInitializer<MereSyncObjectContext>(null);
        Database.ExecuteSqlCommand(CreateDatabaseInstallationScript());
        SaveChanges();
    }

    public void Uninstall()
    {
        //this.DropPluginTable("MereSys_TableName");
    }

    IDbSet<TEntity> IDbContext.Set<TEntity>()
    {
        return base.Set<TEntity>();
    }

    public IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) where TEntity : BaseEntity, new()
    {
        throw new NotImplementedException();
    }

    public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters)
    {
        throw new NotImplementedException();
    }

    public int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = default(int?), params object[] parameters)
    {
        throw new NotImplementedException();
    }

    public void Detach(object entity)
    {
        throw new NotImplementedException();
    }
}

任务类

public class ProductSyncTask : ITask
{
    private readonly ILogger _logger;
    public ProductSyncTask(ILogger logger)
    {
        this._logger = logger;
    }
    public async void Execute()
    {
        //TODO: Call My method, USE BEST PRACTICE, IoC DI
        //throw new NotImplementedException();
        _logger.InsertLog(Nop.Core.Domain.Logging.LogLevel.Information, "Start", "Product sync has started");
        ProductSyncService test = new ProductSyncService();
        await test.GetProductsAsync();
    }
}

问题

当我在 Nopcommerce 后端导航到日志文件时

管理区 > 系统 > 日志

我希望在那里看到我的日志语句,但没有显示。

所以我还检查了任务的计划状态,它从未开始。断点也在调试模式下在我的任务类上设置,并且永远不会被命中。

那么,我在这里错过了什么吗?我的暗示正确吗?

笔记:

我已经删除了异步调用,但它什么也没做(因为它从未达到类级别)。清理并重建,在适用的情况下将复制本地设置为 false。插件已安装。机器上的事件查看器不显示任何与 nopcommerce 相关的警告或错误。按下“立即运行”按钮刷新页面但没有指示任务运行,也没有我的类断点在调试模式下命中。

源文件

到目前为止,插件包含我的代码,大多数是多余的,未使用,即休息客户端等,因为我没有进入流程的那个阶段。

4

2 回答 2

2

属性的第一个参数Type是类的完整路径,它继承了ITask接口。第二个参数是插件的命名空间。

所以,你只需要在这里改变:

_schedualTaskService.InsertTask(new Nop.Core.Domain.Tasks.ScheduleTask()
{
    Enabled = true,
    Name = "Product Sync",
    Seconds = 3600,
    StopOnError = false,
    Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync"
});

Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask.MereSyncPlugin, Nop.Plugin.Misc.MereSync"

希望这可以帮助!

于 2017-01-05T12:23:20.790 回答
1

OK Div 在正确的轨道上,但看不到我的文件系统,我忘记了 1 个文件夹。

在这里学习的教训?检查字符串,我忘了我添加了一个不错的额外文件夹,名为......“任务”。

安装的完整路径?

“Nop.Plugin.Misc.MereSync.Tasks.ProductSyncTask,Nop.Plugin.Misc.MereSync.MereSyncPlugin”

nop 中的任务真的就是这么简单。不要像我刚才那样浪费一天!

于 2017-01-05T15:10:03.870 回答