简单的注入器 - AddIdentity等效

时间:2015-12-27 17:09:08

标签: c# asp.net-identity asp.net-core quartz.net simple-injector

我在ASP.NET 5应用程序中使用Simple Injector,需要从内置的Microsoft DI中切换Identity个注册。

目前,它看起来像这样;

services.AddIdentity<AppUser, AppRole>(o => {
    o.Password.RequiredLength = 6;
    o.Password.RequireNonLetterOrDigit = false;
    o.Password.RequireDigit = true;
    o.Password.RequireLowercase = false;
    o.Password.RequireUppercase = false;
})
.AddUserStore<UserStore<AppUser>>()
.AddRoleStore<RoleStore<AppRole>>()
.AddDefaultTokenProviders();

我知道如何使用Container.Register<T>,但我很难找到在Simple Injector中注册这些特定内容的等效方法。还有其他人做过这个可以提供帮助吗?

我正在尝试这样做,因为我需要使用属性注入;我有一个将使用Quartz.NET设置的任务,它会自行实例化,就像这样 -

public class HelloJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Greetings from HelloJob!");
    }
}


// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("job1", "group1")
    .Build();

// Trigger the job to run now, and then repeat every 10 seconds
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .RepeatForever())
    .Build();

// Tell quartz to schedule the job using our trigger
scheduler.ScheduleJob(job, trigger);

我需要对HelloJob.Execute内部的数据库执行某些操作,但由于它不是Controller(即使它是,它也不会像一个一样被激活),我无法将数据库注入构造函数。

1 个答案:

答案 0 :(得分:2)

Quartz.NET允许截获作业的创建,这允许您将创建转发到ASP.NET配置系统或Simple Injector(无论您喜欢什么)。我不熟悉Quartz以及它们现在如何与ASP.NET 5集成,但是IJobFactory的概念。转发呼叫是实施NewJob()方法的问题。例如,这是Simple Injector的实现:

public class SimpleInjectorJobFactory : IJobFactory {
    private readonly Container container;
    public SimpleInjectorJobFactory(Container container) {
        this.container = container;
    }
    public IJob NewJob(TriggerFiredBundle bundle) {
        return (IJob)container.GetInstance(bundle.JobDetail.JobType);
    }
}

对于ASP.NET 5,实现可能如下所示:

public class SimpleInjectorJobFactory : IJobFactory {
    private readonly IServiceProvider container;
    public SimpleInjectorJobFactory(IServiceProvider container) {
        this.container = container;
    }
    public IJob NewJob(TriggerFiredBundle bundle) {
        return (IJob)container.GetRequiredService(bundle.JobDetail.JobType);
    }
}

通过这种方式,您可以简单地将依赖项注入HelloJob的构造函数中,并且不需要恢复属性注入。防止进行财产注入。

Here's complete example如何将Quartz.NET与Simple Injector集成。