Giter VIP home page Giter VIP logo

autofac.extras.quartz's Introduction

Autofac.Extras.Quartz

Autofac integration package for Quartz.Net.

Autofac.Extras.Quartz creates nested litefime scope for each Quartz Job. Nested scope is disposed after job execution has been completed.

This allows to have single instance per job execution as well as deterministic disposal of resources.

Install package via Nuget: install-package Autofac.Extras.Quartz

Build status

Stable Pre-release
Build Master branch Development branch
NuGet NuGet NuGet
CodeCov codecov codecov

Usage example

Autofac configuration for Quartz includes two steps:

  1. Scheduler registration
  2. Job registration

Scheduler registration

QuartzAutofacFactoryModule registers custom ISchedulerFactory and default instance of IScheduler in Autofac container. Both factory and schedulere are registered as singletones. Note: Is is important to resolve IScheduler from container, rather than using default one to get jobs resolved by Autofac.

Optionally custom Quartz configuration can be passed using ConfigurationProvider property. Provider is callback which returns settings using NameValueCollection.

Job scope configuration

Starting with version 7 QuartzAutofacFactoryModule provides a way to customize lifetime scope configuration for job. This can be done via JobScopeConfigurator parameter.

cb.Register(_ => new ScopedDependency("global"))
    .AsImplementedInterfaces()
    .SingleInstance();

cb.RegisterModule(new QuartzAutofacFactoryModule {
    JobScopeConfigurator = (builder, jobScopeTag) => {
        // override dependency for job scope
        builder.Register(_ => new ScopedDependency("job-local "+ DateTime.UtcNow.ToLongTimeString()))
            .AsImplementedInterfaces()
            .InstancePerMatchingLifetimeScope(jobScopeTag);

    }
});

See src/Samples/Shared/Bootstrap.cs for details.

Job registration

QuartzAutofacJobsModule scans given assemblies and registers all non-abstract implementors of IJob interface as transient instances.

internal static ContainerBuilder ConfigureContainer(ContainerBuilder cb)
{
	// 1) Register IScheduler
	cb.RegisterModule(new QuartzAutofacFactoryModule()); 
	// 2) Register jobs
	cb.RegisterModule(new QuartzAutofacJobsModule(typeof (CleanupExpiredAnnouncemetsJob).Assembly));
}

Starting Quartz

Make sure to start the scheduler after it was resolved from Autofac. E.g.

var scheduler = _container.Resolve<IScheduler>();
scheduler.Start();

Sample projects

TopShelf-based sample was removed since Topshelf.Quartz is not compatible with Quartz 3 as af now.

autofac.extras.quartz's People

Contributors

cd21h avatar chrisdrobison avatar chriseldredge avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar jafin avatar jasonlandbridge avatar kjellski avatar mikhail-vazhenin avatar yegorpetrov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

autofac.extras.quartz's Issues

One importand

Dear authors.

First of all I want to thank you for your work, time and efforts.
I have one suggeston. Could you please add to the README.md the following paragraph?

Start the Quartz scheduler.

var scheduler = _container.Resolve<IScheduler>();
if ( !scheduler.IsStarted ) {
    scheduler.Start();
}

It will help a lot for users which rarely work with Quartz. For example I spent several hours before than I realized why quartz is not working.

Thanks in advance!

CronSchedule not working properly

Not working code

var trigger = TriggerBuilder.Create()
                    .WithIdentity(triggerKey)
                    .WithCronSchedule("0 30 5 * * ?")
                    .Build();

console logs:

2018-07-23 21:12:16,187 1 INFO Quartz.Core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v3.0.6.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
  Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2018-07-23 21:12:16,187 1 INFO Quartz.Impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized
2018-07-23 21:12:16,188 1 INFO Quartz.Impl.StdSchedulerFactory - Quartz scheduler version: 3.0.6.0
Ready to start scheduler
2018-07-23 21:12:16,267 1 INFO Quartz.Core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2018-07-23 21:12:16,277 3 DEBUG Quartz.Core.QuartzSchedulerThread - Batch acquisition of 0 triggers

Working code:

var trigger = TriggerBuilder.Create()
                    .WithIdentity("triggerKey")
                    .WithCronSchedule("* * * * * ?")
                    .Build();

Console logs:

2018-07-23 21:08:36,149 1 INFO Quartz.Core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v3.0.6.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
  Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2018-07-23 21:08:36,150 1 INFO Quartz.Impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized
2018-07-23 21:08:36,150 1 INFO Quartz.Impl.StdSchedulerFactory - Quartz scheduler version: 3.0.6.0
Ready to start scheduler
2018-07-23 21:08:36,217 1 INFO Quartz.Core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2018-07-23 21:08:36,230 3 DEBUG Quartz.Core.QuartzSchedulerThread - Batch acquisition of 1 triggers

Also tried with trigger = CronScheduleBuilder.WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday, 5, 4).Build();, not working either.

Can't resolve symbol UseAutofacContainer

I have this installed and autofac installed but when I try to use UseAutofacContainer it throws a fit.

Here's what I have installed

Autofac 4.1.0
Autofac.Extras.Quartz 3.1.0
Topshelf 4.0.1
Topshelf.Quartz 0.4.0.1

I'm lost on why it's not available as an option, is the example code outdated?

Thanks

JobWrapper hides IInterruptableJob

IInterruptableJob interface gets ignored because an instance of JobWrapper is used instead of an actual Job instance so a job can't be interrupted. For instance, here is the specific line of Quartz.NET code that stops working:
https://github.com/quartznet/quartznet/blob/master/src/Quartz/Core/QuartzScheduler.cs#L586

Also, there might be issues with [DisallowConcurrentExecution] and [PersistJobDataAfterExecution], but i'm not sure about that. Even if it works now, some tiny change made in Quartz.NET may later introduce some bugs that would be hard to detect.

.NET version compatibility

I think you mistyped the .Net framework version in the NuGet requirements; its 4.6.2 the same as the needed autofac version(compatible with 4.5 .NET framework version).

Multiple scheduler configs possible?

I need to have two different ISchedulerFactory defined with different configuration. Currently i do something like this:

var properties = new NameValueCollection { { "quartz.threadPool.threadCount", "1" } };
var schedulerSingleThreadFactory = new StdSchedulerFactory(properties);
var schedulerNoLimitsFactory = new StdSchedulerFactory();

Then i create a scheduler from each factory ... like:

_schedulerSingleThread = schedulerSingleThreadFactory.GetScheduler();
_schedulerMultipleThreads = schedulerNoLimitsFactory.GetScheduler();

Then I schedule jobs on eachscheduler.

Is it possible to create multiple schedulers that take different configurations?

How to use Autofac.Extras.Quartz with web appilcation MVC 4 & Autofac

I m trying to Quartz with my MVC 4 application & Autofac but scheduler is not running. I tried your given Sample project which is console based application. it is running fine but when i tried to use same thing in web application (MVC 4 & Autofac), it is not running. Please let me, how can I use in web application (MVC 4 & Autofac) if you have any sample please give us?

Make AutofacJobFactory.NewJob virtual

If a job fails to be created, Quartz v2.6 sets its triggers into error state and nothing short of restarting the service (if it's running part of a service) will make the job restart (as per this SO answer and empirical attempts).

If the AutofacJobFactory.NewJob was virtual, one could replace the AutofacJobFactory with a sub-class a bit more tolerant to failed-starts, for example returning a NoOpJob when base.NewJob throws a SchedulerConfigException.

Would it be possible to make this change and release a version of Autofac.Extras.Quartz against 2.6?

Configuring scheduler in code.

It doesn't seem to be possible to use QuartzAutofacFactoryModule but to configure the scheduler in code (e.g. by configuring DirectSchedulerFactory and getting a scheduler from there) instead of using a config file.

Am I missing a way to do this with the current implementation, or could this feature be added?

Currently we're working around this by creating our own Module.

IScheduler registration question

Hello,

I noticed on here, ConfigureAwait is set to false.

https://github.com/alphacloud/Autofac.Extras.Quartz/blob/master/src/Autofac.Extras.Quartz/QuartzAutofacFactoryModule.cs#L91

I'm not an async expert, but I've had issues where doing this where resources would not get disposed correctly. Is there any reason for doing this? I'm tracking down an issue where Quartz threads seem to be hanging open even though all work has finished, and I've spent hours in Quartz source code with no luck.

Any comments/guidance appreciated.

I don't want to register all IJob's

Hi, what if I don't want to register all IJob implementations or if I have custom and multiple interface's instead of IJob. What if then?

Your QuartzAutofacJobsModule implementation only scan for IJob in the given assemblies; I think it is a blocking feature...

Regards...

You can not use KeyFilter WithAttributeFiltering

You can not use KeyFilter

var registrationBuilder = builder.RegisterAssemblyTypes(_assembliesToScan)
.Where(type => !IsAbstract(type) && typeof(IJob).IsAssignableFrom(type) && FilterJob(type))
.AsSelf()
.WithAttributeFiltering()
.InstancePerLifetimeScope();

Support for IJobListener

Hi Guys,

Is there any support for registering IJobListeners that would be resolved by Autofac?

Thanks,
-Adam

[Lock] Configuration error

Lock has encountered a configuration error in lock.yml.

ValidationError: child "lockLabel" fails because ["lockLabel" must be a string, "lockLabel" must be one of [false]]

Should call shutdown on IScheduler

Right now, in order to have the process terminate properly, I have to create a custom Autofac component that resolves the IScheduler and invokes Shutdown(false) on it.

The QuartzAutofacFactoryModule should be registering this when the component is deactivated. It really should probably call Start too. It's a singleton, afterall. The module seems to claim ownership.

Sample code?

Would be nice with some minimal instructions or sample code.
Please add

Resolving from the correct lifetime scope

In the QuartzAutofacFactoryModule, I believe the delegate method for resolving the JobFactory could be improved to support tagged lifetime scopes. Such as the popular Multitenant autofac contrib.

This code appears to always resolve the root lifetime scope, which would not be correct in custom nested lifetime scopes:

builder.Register(c => new AutofacJobFactory(c.Resolve<ILifetimeScope>(), _lifetimeScopeName))
                .AsSelf()
                .As<IJobFactory>()
                .SingleInstance();

This may not be a defect since the module is there for convenience custom lifetime scope users can of course provide their own registrations.

But I believe the correct lifetime can be achieved by using code along the lines of:

builder.Register(c =>
            {
                var ctx = c.Resolve<IComponentContext>();
                var lifetimeScope = ctx.Resolve<ILifetimeScope>();
                return new AutofacJobFactory(lifetimeScope, lifetimeScope.Tag.ToString());
            })
             .AsSelf()
             .As<IJobFactory>()
             .InstancePerTenant();

As an aside, I believe resolving from the component context in delegate resolve methods is "preferred" method so it always captures the correct scope. In case this helps someone else, here is my full "override" of the QuartzAutofacFactoryModule that works with Autofac.Extras.Multitenant

var configuration = new NameValueCollection
            {
                [StdSchedulerFactory.PropertySchedulerInstanceName] =
                    string.Format("TaskScheduler {0}", Tenant.Current.TenantId)
            };
            builder.Register(c =>
            {
                var ctx = c.Resolve<IComponentContext>();
                var lifetimeScope = ctx.Resolve<ILifetimeScope>();
                return new AutofacJobFactory(lifetimeScope, lifetimeScope.Tag.ToString());
            })
             .AsSelf()
             .As<IJobFactory>()
             .InstancePerTenant();

            Func<IComponentContext,NameValueCollection> cfgProvider = ctx => configuration;

            builder.Register<ISchedulerFactory>(c =>
            {
                var ctx = c.Resolve<IComponentContext>();
                var autofacSchedulerFactory = new AutofacSchedulerFactory(cfgProvider(ctx), ctx.Resolve<AutofacJobFactory>());                   
                return autofacSchedulerFactory;
            })
            .InstancePerTenant();

            builder.Register(c => c.Resolve<ISchedulerFactory>().GetScheduler())
                .As<IScheduler>().InstancePerTenant();

Thanks!
Mike

MissingMethodException with Autofac 4.0.0-rc3-280

With the latest Autofac 4.0.0-rc3-280 there is a runtime issue at my
var container = builder.Build();

Error:
An unhandled exception of type 'System.MissingMethodException' occurred in Autofac.dll
Additional information: Method not found: 'Autofac.Builder.IRegistrationBuilder3<!0,!1,!2> Autofac.Builder.IRegistrationBuilder3.PropertiesAutowired(Autofac.PropertyWiringOptions)'.

The problem seems to be in QuartzAutofacJobsModule:
registrationBuilder.PropertiesAutowired(PropertyWiringOptions);

There is no overload anymore with the parameter.

Possible solution:
registrationBuilder.PropertiesAutowired(new DefaultPropertySelector(PropertyWiringOptions == PropertyWiringOptions.PreserveSetValues));

Could you produce a NuGet package that doesn't depend on Resharper Annotations?

First of all, thanks for taking the time to create this package. It's nice not to have to write this code ourselves.

We don't use Resharper Annotations in our code and would prefer not to have our projects depend on the Resharper Annotations NuGet package. Would it be possible not to require our projects that use this package to also depend on Resharper Annotations?

DisallowConcurrencyExecution attribute not honored

The DisallowConcurrencyExecution attribute is ignored and multiple jobs are spawned.

I am using as follows:
registration

            builder.RegisterModule(new QuartzAutofacFactoryModule());
            builder.RegisterType<CompanyDatabaseProcessor>().As<IJob>().InstancePerLifetimeScope();

setup

            var fact = container.Resolve<IJobFactory>();

            _scheduler = StdSchedulerFactory.GetDefaultScheduler();
            _scheduler.JobFactory = fact;
            _scheduler.Start();

            var job = JobBuilder.Create<IJob>()
                .WithIdentity("QProcJob", "A3Group")
                .Build();

            var trigger = TriggerBuilder.Create()
                .WithIdentity("QProcTrigger", "A3Group")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(executeEvery)
                    .RepeatForever())
                .Build();

            _scheduler.ScheduleJob(job, trigger);

and when in my IJob, I check the context.JobDetail.ConcurrentExecutionDisallowed it is always set to false.

Fix flaky tests

Review and fix Autofac.Extras.Quartz.Tests.ScopeTrackerTests.ShouldDisposeScopeAfterJobCompletion

Quartz.SchedulerException : The Scheduler has been Shutdown.
   at Quartz.Core.QuartzScheduler.ValidateState()
   at Quartz.Core.QuartzScheduler.<ScheduleJob>d__82.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Autofac.Extras.Quartz.Tests.ScopeTrackerTests.<ShouldDisposeScopeAfterJobCompletion>d__11.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at NUnit.Framework.Internal.AsyncInvocationRegion.AsyncTaskInvocationRegion.WaitForPendingOperationsToComplete(Object invocationResult)
   at NUnit.Framework.Internal.Commands.TestMethodCommand.RunAsyncTestMethod(TestExecutionContext context)

Cannot instantiate type which has no empty constructor

I have the following code

containerBuilder.RegisterModule(new QuartzAutofacFactoryModule());
containerBuilder.RegisterModule(new QuartzAutofacJobsModule(typeof(CalculatorJob).Assembly));

public class CalculatorJob : IJob
    {
        private readonly ICalculator calculator;

        public CalculatorJob(ICalculator calculator)
        {
            this.calculator = calculator;
        }

        public void Execute(IJobExecutionContext context)
        {
            calculator.PerformCalculator();
        }
    }

and I get following error

  - FirstChance Exception  -- Cannot instantiate type which has no empty constructor
Parameter name: CalculatorJob
System.ArgumentException: Cannot instantiate type which has no empty constructor
Parameter name: CalculatorJob
   at Quartz.Util.ObjectUtils.InstantiateType[T](Type type) in c:\projects\quartznet-6fcn8\src\Quartz\Util\ObjectUtils.cs:line 107
Exception thrown: 'Quartz.SchedulerException' in Quartz.dll
SchedulerTest1.Service.Program: FATAL 2017-12-11 12:21:26,442 [DefaultQuartzScheduler_QuartzSchedulerThread] SchedulerTest1.Service.Program           - FirstChance Exception  -- Problem instantiating class 'SchedulerTest1.Infrastracture.Jobs.CalculatorJob'
Quartz.SchedulerException: Problem instantiating class 'SchedulerTest1.Infrastracture.Jobs.CalculatorJob' ---> System.ArgumentException: Cannot instantiate type which has no empty constructor
Parameter name: CalculatorJob
   at Quartz.Util.ObjectUtils.InstantiateType[T](Type type) in c:\projects\quartznet-6fcn8\src\Quartz\Util\ObjectUtils.cs:line 107
   at Quartz.Simpl.SimpleJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\SimpleJobFactory.cs:line 68
   --- End of inner exception stack trace ---
   at Quartz.Simpl.SimpleJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\SimpleJobFactory.cs:line 76 [See nested exception: System.ArgumentException: Cannot instantiate type which has no empty constructor
Parameter name: CalculatorJob
   at Quartz.Util.ObjectUtils.InstantiateType[T](Type type) in c:\projects\quartznet-6fcn8\src\Quartz\Util\ObjectUtils.cs:line 107
   at Quartz.Simpl.SimpleJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\SimpleJobFactory.cs:line 68]
Exception thrown: 'Quartz.SchedulerException' in Quartz.dll
SchedulerTest1.Service.Program: FATAL 2017-12-11 12:21:26,457 [DefaultQuartzScheduler_QuartzSchedulerThread] SchedulerTest1.Service.Program           - FirstChance Exception  -- Problem instantiating class 'SchedulerTest1.Infrastracture.Jobs.CalculatorJob'
Quartz.SchedulerException: Problem instantiating class 'SchedulerTest1.Infrastracture.Jobs.CalculatorJob' ---> System.ArgumentException: Cannot instantiate type which has no empty constructor
Parameter name: CalculatorJob
   at Quartz.Util.ObjectUtils.InstantiateType[T](Type type) in c:\projects\quartznet-6fcn8\src\Quartz\Util\ObjectUtils.cs:line 107
   at Quartz.Simpl.SimpleJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\SimpleJobFactory.cs:line 68
   --- End of inner exception stack trace ---
   at Quartz.Simpl.SimpleJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\SimpleJobFactory.cs:line 76
   at Quartz.Simpl.PropertySettingJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\PropertySettingJobFactory.cs:line 95
   at Quartz.Core.JobRunShell.Initialize(QuartzScheduler sched) in c:\projects\quartznet-6fcn8\src\Quartz\Core\JobRunShell.cs:line 96 [See nested exception: System.ArgumentException: Cannot instantiate type which has no empty constructor
Parameter name: CalculatorJob
   at Quartz.Util.ObjectUtils.InstantiateType[T](Type type) in c:\projects\quartznet-6fcn8\src\Quartz\Util\ObjectUtils.cs:line 107
   at Quartz.Simpl.SimpleJobFactory.NewJob(TriggerFiredBundle bundle, IScheduler scheduler) in c:\projects\quartznet-6fcn8\src\Quartz\Simpl\SimpleJobFactory.cs:line 68]

ReturnJob exception on DisposeScope due to null trackingInfo

Haven't determined why I dont have trackingInfo but this code is crashing due to being returned a null trackingInfo.

public void ReturnJob(IJob job)
        {
            JobTrackingInfo trackingInfo;
            if (!RunningJobs.TryRemove(job, out trackingInfo))
            {
                s_log.WarnFormat("Tracking info for job 0x{0:x} not found", job.GetHashCode());
            }

          DisposeScope(job, trackingInfo.Scope);  //trackingInfo is null here.
        }

This occurs for jobs running in a windows service that is issued a stop command.

is it safe to change this to ?

public void ReturnJob(IJob job)
        {
            JobTrackingInfo trackingInfo;
            if (!RunningJobs.TryRemove(job, out trackingInfo))
            {
                s_log.WarnFormat("Tracking info for job 0x{0:x} not found", job.GetHashCode());
            } 
if (trackingInfo != null) {
          DisposeScope(job, trackingInfo.Scope);  //trackingInfo is null here.
        }

[Lock] Configuration error

Lock has encountered a configuration error in lock.yml.

ValidationError: child "lockLabel" fails because ["lockLabel" must be a string, "lockLabel" must be one of [false]]

Jobs with dependencies..

I am probably not seeing how to do this in a more straight forwrad manner; but I have some jobs with optional dependencies (set via properties).

Using the QuartzAutofacJobsModule to register my jobs means the properties don't get wired.

To solve the problem for myself I just moved the "build" logic out of your module and reused it in my own module (while still using your factory module).

I ended up just needing to add PropertiesAutowired()

Is there a better way that I could have done this? Or is there a chance you could add that (even optionally) to the QuartzAutofacJobsModule?

Thanks

Here is my modules logic:

             builder.RegisterAssemblyTypes(_assemblyToScan)
               .Where(type => !type.IsAbstract && typeof(IJob).IsAssignableFrom(type))
               .PropertiesAutowired()
               .AsSelf().InstancePerLifetimeScope();

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.