MVC5中的IPrincipal依赖注入

3
在另一个stackoverflow问题MVC5 IoC和身份验证中,第一个答案说明作者使用依赖注入来注入IPrincipal。我希望能够为我的组装器也做到这一点,以便我不必从控制器传递当前用户(IPrincipal)。

请问有人可以给出如何在C# MVC5中使用DI来注入IPrincipal的示例吗?以下是我要实现它的IoC。在第一个答案给出后添加。
    public class ViewModelAssemblersInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<IAspNetUserAssembler>()
                .ImplementedBy<AspNetUserAssembler>());
        }
    }
2个回答

7
对于Castle Windsor,它大概是这样的:
container.Register(Component.For<IPrincipal>()
  .LifeStyle.PerWebRequest
  .UsingFactoryMethod(() => HttpContext.Current.User));

只是一个侧记,User.Identity.GetUserId() 方法是扩展方法,你必须包含以下 using 才能访问它。using Microsoft.AspNet.Identity; - Tom
你知道对于Simple Injector会怎么样吗? - DkAngelito

6

这将取决于您的IoC容器... 对于我来说,我使用Unity,在我的容器注册中,我能够做到以下几点:

container.RegisterType<IPrincipal>(new InjectionFactory(u => HttpContext.Current.User));

使用InjectionFactory,Unity将执行lambda表达式,并在构造函数注入时返回当前的HttpContext.Current.User。我还可以在非 Web 应用程序中使用相同类型的注册,而不是引用Thread.CurrentPrincipal

1
我会将u重命名为c,因为它代表容器 :) - abatishchev
这看起来是很棒的信息,但我的项目正在使用Windsor。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接