GithubHelp home page GithubHelp logo

Comments (10)

nnhy avatar nnhy commented on May 29, 2024

1,handler 支持 ObjectContainer形式的构造函数注入

// 实例化调度器
var sc = new Scheduler
{
Tracer = _tracer,

// 使用分布式调度引擎替换默认的本地文件调度
Provider = new NetworkJobProvider
{
    Server = set.Server,
    AppID = set.AppID,
    Secret = set.Secret,
    Debug = false
}

};

// 添加作业
sc.AddHandler();
sc.AddHandler();

// 启动调度引擎,调度器内部多线程处理
sc.Start();

///

清洗手机号。从订单数据中清洗手机号
[DisplayName("清洗手机号")]
[Description("从订单数据中清洗手机号")]
public class BuildMobile : DataHandler
{
private readonly ICache _cache;

public BuildMobile(ICache cache)
{
    var job = Job;
    job.Start = DateTime.Today;
    job.Step = 3600;
    job.Offset = 30;
    job.Mode = JobModes.Data;

    _cache = cache;
}

2,调度器的Start/Stop暂时没有规划支持异步,它不是非常频繁执行的方法,异步价值不明显

from antjob.

gainorloss avatar gainorloss commented on May 29, 2024

handlerexecute 方法感觉是不是有异步的必要
一个是多次执行,再一个是现在netcore 推荐异步 注入的服务都是异步在里头调用的时候就不大好集成了

from antjob.

gainorloss avatar gainorloss commented on May 29, 2024

handler 支持 ObjectContainer形式的构造函数注入

不好意思 ,请问一下,这个 ObjectContainer 形式是怎么理解的

from antjob.

nnhy avatar nnhy commented on May 29, 2024

handlerexecute 方法感觉是不是有异步的必要
一个是多次执行,再一个是现在netcore 推荐异步 注入的服务都是异步在里头调用的时候就不大好集成了

这个目前还没打算支持异步,蚂蚁调度的分布式处理能力非常强劲,足以“摧毁”(读写)任意数据库。它的瓶颈在于外部io,本地是否异步没有什么区别。

from antjob.

nnhy avatar nnhy commented on May 29, 2024

handler 支持 ObjectContainer形式的构造函数注入

不好意思 ,请问一下,这个 ObjectContainer 形式是怎么理解的

这是 newlife.core 内置的对象容器,支持DI。

var services = ObjectContainer.Current;
services.AddSingleton(MemoryCache.Default);

var provider = ObjectContainer.Provider;
var handler = provider.GetService();

这样子得到的 BuildMobile 实例,可通过构造函数注入 ICache。

在NewLife体系里面,有非常多项目不是aspnetcore,只是普通netcore,或者nfx,不会引入微软那一套DI框架。

对象容器ObjectContainer · 语雀
https://www.yuque.com/smartstone/nx/object_container

轻量级应用主机Host · 语雀
https://www.yuque.com/smartstone/nx/host

from antjob.

gainorloss avatar gainorloss commented on May 29, 2024

在NewLife体系里面,有非常多项目不是aspnetcore,只是普通netcore,或者nfx,不会引入微软那一套DI框架。

如果要引入我们目前的项目,可能要适配一下注入容器,因为目前的都是基于 Microsoft.Extenisons.DependencyInjection

from antjob.

gainorloss avatar gainorloss commented on May 29, 2024

这边在对 ObjectContainerIServiceProvider 进行适配的时候,发现,诸如

未找到适合 'Microsoft.Extensions.Hosting.Internal.ApplicationLifetime' 的构造函数,请确认该类型构造函数所需参数均已注册。无法解析参数 'Microsoft.Extensions.Logging.ILogger`1[Microsoft.Extensions.Hosting.Internal.ApplicationLifetime] logger'

IObjectContainer 是否是无法支持 泛型类型的诸如比方说 ILogger`1

from antjob.

nnhy avatar nnhy commented on May 29, 2024

IObjectContainer是轻量级对象容器,仅用于NewLife组件内部使用。
所以,默认它没有注册ILogger等类型

from antjob.

gainorloss avatar gainorloss commented on May 29, 2024

image
思路上是通过 对 IServiceProviderFactory的适配 让 ObjectContainer 可以取代 默认容器,这样的话就可以 在 NC 的任意环境使用 ObjectContainer,进而在任意 应用(包含 Console,Worker,API,MVC,Razor,Blazor-Server)下使用 NewLife,但是适配过程中发现了这个问题,

这边在对 ObjectContainerIServiceProvider 进行适配的时候,发现,诸如

未找到适合 'Microsoft.Extensions.Hosting.Internal.ApplicationLifetime' 的构造函数,请确认该类型构造函数所需参数均已注册。无法解析参数 'Microsoft.Extensions.Logging.ILogger`1[Microsoft.Extensions.Hosting.Internal.ApplicationLifetime] logger'

IObjectContainer 是否是无法支持 泛型类型的诸如比方说 ILogger`1

主机集成代码如下

 Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
            .UseServiceProviderFactory(new ObjectContainerServiceProviderFactory())

ObjectContainerServiceProviderFactory代码如下

public class ObjectContainerServiceProviderFactory
        : IServiceProviderFactory<IObjectContainer>
    {
        public IObjectContainer CreateBuilder(IServiceCollection services)
        {
            return ToObjectContainer(services);
        }

        public IServiceProvider CreateServiceProvider(IObjectContainer containerBuilder)
        {
            return containerBuilder.BuildServiceProvider();
        }

        private IObjectContainer ToObjectContainer(IServiceCollection services)
        {
            var ioc = ObjectContainer.Current;

            foreach (var service in services)
                RegisterServiceToObjectContainer(ioc, service);

            return ioc;
        }

        private void RegisterServiceToObjectContainer(IObjectContainer ioc, ServiceDescriptor service)
        {
            switch (service.Lifetime)
            {
                case ServiceLifetime.Singleton:
                    if (service.ImplementationType != null)
                    {
                        ioc.AddSingleton(service.ServiceType, service.ImplementationType);
                        break;
                    }

                    if (service.ImplementationInstance != null)
                    {
                        ioc.AddSingleton(service.ServiceType, service.ImplementationInstance);
                        break;
                    }

                    if (service.ImplementationFactory != null)
                    {
                        ioc.AddSingleton(service.ServiceType, service.ImplementationFactory);
                        break;
                    }

                    break;
                case ServiceLifetime.Scoped:
                case ServiceLifetime.Transient:
                default:
                    if (service.ImplementationType != null)
                    {
                        ioc.AddTransient(service.ServiceType, service.ImplementationType);
                        break;
                    }

                    if (service.ImplementationInstance != null)
                    {
                        ioc.AddTransient(service.ServiceType, sp => service.ImplementationInstance);
                        break;
                    }

                    if (service.ImplementationFactory != null)
                    {
                        ioc.AddTransient(service.ServiceType, service.ImplementationFactory);
                        break;
                    }
                    break;
            }
        }
    }

@nnhy 大佬感觉有必要吗,我这个思路还主流吗

from antjob.

nnhy avatar nnhy commented on May 29, 2024

IObjectContainer的确无法支持泛型ILogger,它只是一个轻量级对象容器,用于NewLife生态各个项目之间解耦。
并且,IObjectContainer也不支持Scope,局限性还是比较大。

你研究的替换提供者的方向挺好,但是用的人比较少,毕竟微软的DI还是很了不起的。

建议区分对待,如果是简单项目,直接用IObjectContainer,不用引入aspnetcore,参考零代的例子项目:
https://github.com/NewLifeX/NewLife.Zero

如果是复杂项目,使用aspnetcore,自己解决参数传入作业

from antjob.

Related Issues (10)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.