Простой инжектор — эквивалент AddIdentity

Я использую Simple Injector в приложении ASP.NET 5, и мне нужно переключить свои Identity регистрации из встроенного Microsoft DI.

В настоящее время это выглядит так;

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 (а даже если бы и был, то не активировался бы как один), я не могу внедрить базу данных в конструктор.


person Ciel    schedule 27.12.2015    source источник
comment
Что вы хотите зарегистрировать в Simple Injector и почему?   -  person Steven    schedule 27.12.2015
comment
Мне нужно использовать внедрение свойств в классе, который не наследуется от Controller. Я искал несколько дней, и это кажется невозможным со встроенной инъекцией зависимостей, поэтому мне нужно изучить стороннюю.   -  person Ciel    schedule 27.12.2015
comment
По какой-то причине Microsoft предполагает, что единственное время — когда-либо — использовать DI — это контроллеры. Но я пытаюсь запустить некоторый код с помощью Quartz.NET, и для этого созданный мной IJob должен попасть в базу данных. Я не могу придумать никакого другого способа получить базу данных, кроме внедрения свойств или жестко закодированного экземпляра. Итак, я пробую SimpleInjector.   -  person Ciel    schedule 27.12.2015
comment
Истинный; внедрение свойств невозможно со встроенным контейнером внедрения зависимостей. Но на самом деле обычно не следует использовать внедрение свойств. Внедрение конструктора является предпочтительным и рекомендуемым способом внедрения зависимостей. Можете ли вы обновить свой вопрос, указав более подробную информацию о том, почему вы считаете, что вам нужна инъекция свойств. Кроме того, совет состоит в том, чтобы позволить регистрации фреймворка и третьих сторон внутри системы конфигурации ASP.NET и добавлять перекрестные регистрации в Simple Injector только для тех регистраций, которые действительно требуются вашим собственным компонентам напрямую.   -  person Steven    schedule 27.12.2015
comment
Хорошо, я обновил его.   -  person Ciel    schedule 27.12.2015
comment
человек этот материал расстраивает. Я не могу понять, является ли это той же проблемой, что и мой другой вопрос, или нет. Я просто хочу использовать Simple Injector, а не связываться со встроенным Microsoft DI. Но такое ощущение, что это вообще невозможно.   -  person Ciel    schedule 28.12.2015
comment
В Интернете есть много руководств, показывающих, как это сделать, но почти все они предназначены для asp.net 5 beta5 или ниже и больше не являются точными.   -  person Ciel    schedule 28.12.2015


Ответы (1)


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, и вам не нужно возвращаться к внедрению свойств. Запретить внедрение свойств.

Вот полный пример интеграции Quartz.NET с Simple Инжектор.

person Steven    schedule 28.12.2015
comment
Это очень хорошая информация, и хотя это то, что мне в конечном итоге нужно сделать, это все еще не решает проблему невозможности запуска SimpleInjector под ASP.NET 5. По крайней мере, я так не думаю, если я не пропустил кое-что, что ты сказал мне. - person Ciel; 30.12.2015
comment
@Ciel Возможно, вы захотите спросить на форуме Quartz.NET (или надеяться, что ребята из Quartz ответят здесь). Я недостаточно знаком с тем, как Quartz интегрируется с ASP.NET 5, чтобы помочь вам в этом. - person Steven; 30.12.2015