- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个我可以注入(inject)到我的类中的 UserService,它将保存当前登录到我的系统的用户。我正在使用 CaSTLeWindsor 作为我的容器。
现在我的问题是我试图让我的 UserService 成为一次性的,这样在对象被销毁时,在创建时获取用户的数据库连接也会被丢弃。
我在 Global.asax.cs 中添加了以下设置:
private static void BootstrapContainer()
{
_container = new WindsorContainer().Install(FromAssembly.This());
var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(_container.Kernel);
_container.Register(Component.For<IUserService>()
.LifestylePerWebRequest()
.ImplementedBy<UserService>());
_container.Register(Component.For<IPrincipal>()
.LifeStyle.PerWebRequest
.UsingFactoryMethod(() => HttpContext.Current.User));
}
在我的 Application_Start
中调用。
我的UserService代码如下:
public interface IUserService
{
OrganisationBruger User { get; }
int UserId { get; }
}
public class UserService : IUserService, IDisposable
{
private readonly IPrincipal _principal;
private OrganisationBruger _user;
private readonly DatabaseDataContext _db;
public UserService(IPrincipal principal, IDatabaseDataContextFactory dataContextFactory)
{
_principal = principal;
_db = dataContextFactory.GetDataContext();
}
public OrganisationBruger User => _user ?? (_user = GetUser());
public int UserId => Convert.ToInt32(_principal.Identity.Name);
private OrganisationBruger GetUser()
{
return _db.OrganisationBrugers.Single(u => u.ID == UserId);
}
public void Dispose()
{
_db.Dispose();
}
}
当我调试我的代码时,我可以在第一个请求中看到我触发它正确地创建类 UserService.cs
,然后在 webrequest 之后处理它。现在我的问题是第二个 Web 请求似乎不再调用构造函数,因此只是重用以前创建的对象。这导致 DatabaseContext
已经被处理掉。
我认为 LifestylePerWebRequest
意味着 UserService
会根据每个请求重新创建。谁能帮助我理解这一点?
最佳答案
所以首先我忽略了文档中的“模块注册”部分。您需要将以下内容添加到您的 web.config 中:
<httpModules>
<add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor"/>
</httpModules>
其次,我不是百分百确定依赖解析器是如何工作的。问题是使用我的 UserService
作为依赖项的模块之一将其生命周期设置为 Singleton
这是默认行为,当您在注册模块时未指定任何关于生命周期的信息容器。
我通过确保使用我的 UserService 作为依赖项的每个模块也使用 LifestylePerWebRequest()
或 LifestyleTransient()
的生命周期注册来解决这个问题。
关于c# - CaSTLeWindsor LifeStyle.PerWebRequest 表现得像单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899924/
我有两种类型的 ViewModel public class ViewModelA { IService service; privat
我正在尝试创建一个我可以注入(inject)到我的类中的 UserService,它将保存当前登录到我的系统的用户。我正在使用 CaSTLeWindsor 作为我的容器。 现在我的问题是我试图让我的
我的应用程序启动方法中有以下代码以及设置容器和工厂支持的代码。工厂方法似乎只被调用一次而不是每次 session 是需要的。 _container.Kernel.Register( Compo
我有一个包装类如下: // this is not used for IoC purposes, but by code to cast object to known T internal inte
试图找出这件事的真正原因,但并没有太多乐趣! Type is not resolved for member 'Castle.MicroKernel.Lifestyle.Scoped.CallCont
假设我有一个 IOC 容器。我使用该容器注册一个具有单例生活方式的记录器: var container = new Container(); container.Register(LifeStyle.
Container.Collection.Register 似乎没有采用Lifestyle 的重载。所有发现的实现都将注册到默认的 Lifestyle。忽略这种过载背后的原因是什么? 添加一个集合的首
我只是在检查我的理智。这是我使用 simpleinjector 3.3.2 的代码 Container.RegisterPerWebRequest(() => { var context = Ht
我的背景是 .NET,我习惯于使用 CaSTLe Windsor 等工具为我的依赖项设置生活方式(Singleton、PerInstance...)。 我最近转移到一个 Java 项目,其中代码使用
更新: 在 Windsor 2.5 中,程序集名称是 CaSTLe.Windsor 而不是 CaSTLe.MicroKernel 我正在尝试将 ASP.NET MVC 应用程序部署到 IIS7,但收到
我正在尝试为依赖于生活方式为“PerWebRequest”的类型的 Controller 编写单元测试。 CaSTLe 抛出以下异常: System.InvalidOperationException
考虑以下接口(interface)和类定义: public interface IInterface1 { } public interface IInterface2 { } public clas
我正在查看 ProDiner 示例 MVC 项目。我将 CaSTLe Windsor 引用从 2 更新为 3。 public static void RegisterAllFromAssemblies
我将 CaSTLe Windsor 用于 Web API 2 的 DI 容器,我的一些 Controller 具有 EF DbContext 依赖项,我使用以下 CW 安装程序注入(inject)它们
我使用 caSTLe.windsor 和 owin 在 webapi2 中获得了一些 DI。这是相关代码: [assembly: OwinStartup(typeof(Bla.Startup))]
在创建新的网络应用程序时,我使用自制的“外部”库来获得一些基本的基础设施。我最近对我的存储库的工作方式做了一些更改,并从 Simple Injector Diagnostic Warnings 看到了
我有一组服务,我想使用流畅的注册技术在 CaSTLe Windsor(版本 3.0 RC1)中注册。 我希望除了一个特定的人之外的所有人都使用短暂的生活方式,而我想成为单例,所以我这样做: conta
我是一名优秀的程序员,十分优秀!