Внедрить пользовательскую реализацию для хранилища идентификаторов пользователей

#c# #asp.net-mvc #simple-injector

#c# #asp.net-mvc #простой инжектор

Вопрос:

Я добавил пользовательскую реализацию UserStore. Для конструктора хранилища пользователей я ввожу UserRepository как я могу зарегистрировать это с помощью простого контейнера инжектора

мой код, подобный

 public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>,
    IUserSecurityStampStore<User>, IUserEmailStore<User>
{
    private readonly IRepository<User> _userRepository;

    public UserStore(IRepository<User> userRepository)
    {
        _userRepository = userRepository;
    }

    //other implementations
}
  

мой класс UserManager

 public  class UserStoreManager<T> : UserManager<User> where T : class 
{ 
    public UserStoreManager(IUserStore<User> store) : base(store)
    {

    }
}
  

Обновить

я попробовал это, зарегистрировавшись следующим образом

 container.Register<IUserStore<User>, UserStore>(Lifestyle.Scoped);
container.Register<UserManager<User>, UserStoreManager<User>>(Lifestyle.Scoped);
  

затем я получил исключение

введите описание изображения здесь

Комментарии:

1. я понятия не имею, как зарегистрировать IUserStore в контейнер, который я пробовал с этим container.Register<IUserStore<User>>(() => new UserStore(), Lifestyle.Scoped); , но нужен конструктор по умолчанию, инициализированный с помощью IRepository<User> тип

2. Разве вы не можете зарегистрировать тип с помощью простого инжектора вместо добавления инициализатора (и если вам нужно добавить лямбда-выражение для инициализации, разве вы не можете выполнить container.Resolve<IRepository<User>>(), чтобы использовать его в качестве параметра?

3. @Icepickle я не уверен, что правильно вас понял, не могли бы вы добавить какой-нибудь пример кода?

4. Вы пытались понять, что означают сообщаемые предупреждения и почему Simple Injector сообщил о них вам? Вы можете найти подробное описание этих предупреждений, почему они являются проблематичными и как их исправить здесь: simpleinjector.org/diagnostics .

Ответ №1:

Когда мне нужно инициализировать UserStore , я просто использую следующее

 container.RegisterPerWebRequest<IUserStore<User>>(() => new UserStore<User>((IRepository<User>)container.GetInstance<IRepository<User>>()));
  

UserStore требуется экземпляр контекста, однако получить текущий контекст можно только с GetInstance помощью, поскольку он «вычисляется во время выполнения», в зависимости от образа жизни контекста

Редактировать 1

Для UserManager этого вам необходимо выполнить следующее:

 container.RegisterPerWebRequest(() => new ApplicationUserManager(container.GetInstance<IUserStore<ApplicationUser>>(), DataProtectionProvider));
  

Он следует тому же принципу, что и выше.

DataProtectionProvider вызывается ли аргумент моего метода InitializeContainer

 private static void InitializeContainer(Container container, IDataProtectionProvider DataProtectionProvider)
{
    /* OMITTED */
    container.RegisterPerWebRequest(() => new ApplicationUserManager(container.GetInstance<IUserStore<ApplicationUser>>(), DataProtectionProvider));
}
  

который используется на:

 public static void InitializeInjector(this IAppBuilder app, IDataProtectionProvider DataProtectionProvider)
{
    var container = new Container();
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
    container.Options.PropertySelectionBehavior = new PropertySelectionBehavior<InjectAttribute>();

    InitializeContainer(container, DataProtectionProvider); // Here
    app.UseOwinContextInjector(container);
    app.MapSignalR(container);

    container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
    container.Verify();
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

    BinderConfig.RegisterModelBinders(container);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, container);
}
  

который вызывается

 public void Configuration(IAppBuilder app)
{
    ConfigureAuth(app);
    app.InitializeInjector(app.GetDataProtectionProvider());
}
  

Итак, DataProtectionProvider происходит из IAppBuilder