ASP.netSession_Start方法中的依赖注入第一次学习依赖注入,第一次使用autofac。我在几个autofac示例(见下文)和我的application_start调用中提到了构建容器//使用程序集对象注册所有控制器builder.RegisterControllers(Assembly.GetExecutingAssembly());//注册默认约定——IExample和Examplebuilder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(t=>t.Name.Single(i=>i.Name=="I"+t.Name)).AsImplementedInterfaces();//构建容器varcontainer=builder.Build();//设置默认解析器使用AutofacDependencyResolver.SetResolver(newAutofacDependencyResolver(container));我使用IUserService在我的核心项目中创建了UserService。这具有使dbcall从表中获取用户信息的方法。在我的UI项目中,我有一个名为UserProvider的类,我想注入UserService。publicclassUserProvider{privatereadonlyIUserService_userService;publicUserProvider(IUserServiceuserService){_userService=userService;}publicvoidLoadCurrentUser(){UsersFoundUser=_userService.ImportOrGetUser();if(FoundUser!=null){//将其添加到会话CurrentUser=FoundUser;}}}这个UserProvider,我在session_start中用voidSession_OnStart(){UserProviderOUsrPrv=newUserProvider(newUserService());OUsrPrv.LoadCurrentUser();在上面的代码中,如果我传递'newUserService()',我的理解是我手动注入了UserService。我不知道autofac如何在这里提供帮助。google中的所有示例都在谈论MVCController或WebApiController中的依赖注入,而不是像我正在做的那样在单个类(UserProvider)中。有人可以阐明一下吗?我做错什么了吗?System.Web.HttpApplication的事件模型是ASP.NET的一部分,而不是MVC。它不是为与依赖注入一起使用而设计的。Cyril建议的答案是使用服务定位器来获取对服务的引用。这远非理想,因为您依赖于代码中的服务定位器。实现横切关注点(例如将用户数据加载到会话状态)的以MVC为中心的方法是使用全局注册的过滤器。您可以实施IAuthorizationFilter或IActionFilter以获得所需的效果。在这种情况下使用IActionFilter是有意义的,因为在调用之前您要等到确定有授权用户。注意:虽然这可以回答您的具体问题,但最好不要在MVC中使用会话状态。另一种方法是使用ASP.NETIdentitywithClaims来存储用户配置文件数据,而不是使用Session。使用系统;使用System.Web.Mvc;使用System.Security.Principal;公共类GetUserActionFilter:IActionFilter{privatereadonlyIUserRepositoryuserRepository;publicGetUserActionFilter(IUserRepositoryuserRepository){如果(userRepository==null)thrownewArgumentNullException("userRepository");this.userRepository=userRepository;}publicvoidOnActionExecuted(ActionExecutedContextfilterContext){//什么都不做-这发生在action方法运行之后}publicvoidOnActionExecuting(ActionExecutingContextfilterContext){IPrincipaluser=filterContext.HttpContext.User;如果(用户==null){返回;}IIdentityidentity=user.Identity;如果(身份==空){返回;}//确保我们有一个有效的身份并且它已登录。if(identity.IsAuthenticated){stringkey="__CurrentUserData";varuserData=filterContext.HttpContext.Session[key];if(userData==null){//会话中不存在用户数据,所以加载它userData=userRepository.GetUserData(identity.Name);//添加到会话状态filterContext.HttpContext.Session[key]=userData;}}}}现在,要全局添加过滤器,您需要:向AutofacItem注册过滤器及其依赖项,将容器传递给静态RegisterGlobalFilters方法。注册一个过滤器使用命名实例来区分它与其他潜在的IActionFilter实例。builder.RegisterType().Named("getUserActionFilter");通过容器FilterConfig.cspublicclassFilterConfig{publicstaticvoidRegisterGlobalFilters(GlobalFilterCollectionfilters,IContainercontainer){filters.Add(container.ResolveNamed("getUserActionFilter"));filters.Add(newHandleErrorAttribute());}}的Global.asax.cspublicclassMvcApplication:System.Web.HttpApplication{//此方法用作项目的组合根//。protectedvoidApplication_Start(){//注册AutofacDIIContainercontainer=ContainerConfig.RegisterContainer();AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters,container);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);AuthConfig.RegisterAuth();}}ContainerConfig.cspublicclassContainerConfig{publicstaticIContainerRegisterContainer(){//创建一个新的ContainerBuildervarbuilder=newContainerBuilder();//使用程序集对象注册所有控制器builder.RegisterControllers(Assembly.GetExecutingAssembly());//注册默认约定——IExample和示例生成器.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(t=>t.Name.Single(i=>i.Name=="I"+t.Name)).AsImplementedInterfaces();//注册我们的过滤器构建器。RegisterType().Named("getUserActionFilter");//构建容器varcontainer=builder.Build();//设置默认解析器使用AutofacDependencyResolver.SetResolver(newAutofacDependencyResolver(container));//将容器返回到我们的组合根。返回容器;请注意,我刚刚在这里使用了存储库服务,因为HttpContext已经可以通过操作过滤器直接使用,并且这里需要额外的逻辑,因为我们不确定它是否存在于会话状态中,或者是否有用户查找,因此我们的过滤器除了加载会话状态外还执行这些检查。要正确使用依赖注入,你不应该自己创建实例,底层框架应该为你提供它们。但是ASP.net在没有任何依赖注入的情况下调用Session_OnStart。在这种情况下,您可以使用DependencyResolver.Current静态属性来解析请求的服务。以上就是《C#学习教程:ASP.netSession_Start方法中的依赖注入》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——voidSession_OnStart(){userProvider.LoadCurrentUser();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
