#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