1

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

目前,它看起来像这样;

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>,但我有一个很难找到的简单的喷油器注册这些特殊事物相当于方式。有没有其他人可以做到这一点,可能会有所帮助?

我想这样做,因为我需要使用属性注入;我有一个将使用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(和即使它是,它不会像一个激活),我不能注入数据库到构造函数。

+0

你想在Simple Injector中注册什么?为什么? – Steven

+0

我需要在不从'Controller'继承的类中使用属​​性注入。我查找了几天,这似乎不可能与内置的依赖注入,所以我必须探索第三方。 – Ciel

+0

由于某种原因,微软认为唯一一次 - 使用DI是在控制器中。但是我想用'Quartz.NET'运行一些代码,并且要做到这一点,我创建的'IJob'需要到达数据库。我想不出任何其他方式来获取数据库比属性注入或硬编码实例化。所以我正在尝试SimpleInjector。 – Ciel

回答

2

Quartz.NET允许创建要截取的作业,并允许您将创建转发到ASP.NET配置系统或简单注入器(无论您喜欢什么)。我对Quartz并不熟悉,他们现在如何与ASP.NET 5集成,但有IJobFactory的概念。转发呼叫是实施NewJob()方法的问题。举例来说,下面是简单的喷油器的实现:

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。

+0

这是非常好的信息,虽然这是我最终必须做的,但仍不能解决无法让SimpleInjector在ASP.NET 5下运行的问题。至少我不这么认为,除非我错过了你告诉我的东西。 – Ciel

+0

@Ciel你可能想问问在Quartz.NET论坛(或希望石英家伙在这里回答)。我对Quartz如何与ASP.NET 5集成以帮助您解决这个问题还不够熟悉。 – Steven

相关问题