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

相關問題