Comments (10)
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.
handler 的 execute 方法感觉是不是有异步的必要
一个是多次执行,再一个是现在netcore 推荐异步 注入的服务都是异步在里头调用的时候就不大好集成了
from antjob.
handler 支持 ObjectContainer形式的构造函数注入
不好意思 ,请问一下,这个 ObjectContainer 形式是怎么理解的
from antjob.
handler 的 execute 方法感觉是不是有异步的必要
一个是多次执行,再一个是现在netcore 推荐异步 注入的服务都是异步在里头调用的时候就不大好集成了
这个目前还没打算支持异步,蚂蚁调度的分布式处理能力非常强劲,足以“摧毁”(读写)任意数据库。它的瓶颈在于外部io,本地是否异步没有什么区别。
from antjob.
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.
在NewLife体系里面,有非常多项目不是aspnetcore,只是普通netcore,或者nfx,不会引入微软那一套DI框架。
如果要引入我们目前的项目,可能要适配一下注入容器,因为目前的都是基于 Microsoft.Extenisons.DependencyInjection
from antjob.
这边在对 ObjectContainer 和 IServiceProvider 进行适配的时候,发现,诸如
未找到适合 'Microsoft.Extensions.Hosting.Internal.ApplicationLifetime' 的构造函数,请确认该类型构造函数所需参数均已注册。无法解析参数 'Microsoft.Extensions.Logging.ILogger`1[Microsoft.Extensions.Hosting.Internal.ApplicationLifetime] logger'
IObjectContainer 是否是无法支持 泛型类型的诸如比方说 ILogger`1
from antjob.
IObjectContainer是轻量级对象容器,仅用于NewLife组件内部使用。
所以,默认它没有注册ILogger等类型
from antjob.
思路上是通过 对 IServiceProviderFactory的适配 让 ObjectContainer 可以取代 默认容器,这样的话就可以 在 NC 的任意环境使用 ObjectContainer,进而在任意 应用(包含 Console,Worker,API,MVC,Razor,Blazor-Server)下使用 NewLife,但是适配过程中发现了这个问题,
这边在对 ObjectContainer 和 IServiceProvider 进行适配的时候,发现,诸如
未找到适合 '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.
IObjectContainer的确无法支持泛型ILogger,它只是一个轻量级对象容器,用于NewLife生态各个项目之间解耦。
并且,IObjectContainer也不支持Scope,局限性还是比较大。
你研究的替换提供者的方向挺好,但是用的人比较少,毕竟微软的DI还是很了不起的。
建议区分对待,如果是简单项目,直接用IObjectContainer,不用引入aspnetcore,参考零代的例子项目:
https://github.com/NewLifeX/NewLife.Zero
如果是复杂项目,使用aspnetcore,自己解决参数传入作业
from antjob.
Related Issues (10)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from antjob.