我有一个类(MyService
),它有一个静态属性(MyService.Context
),表示当前上下文(特定于当前登录的用户,因此它会更改)。
我想要实现的目标
ObjectFactory.Initialize(x =>
{
x.For<IMyService>().Use<MyInstance>(c => c.Use(MyService.Context));
});
即。因此,对于每个ObjectFactory.GetInstance<IMyService>()
,我都会获得对MyService.Context
可行吗?
更新
我不能使用单例模式,因为MyService.Context
会根据发出请求的用户而变化(通过HttpContext)。
在上面的伪代码中,lambda参数c
表示SM上下文,因此我可以为每个请求返回自定义结果。我知道SM的Intercept()
但是在构造对象之后它被解雇而不是而不是。
答案 0 :(得分:3)
如果您可以使用属性,则可以添加OnCreation
方法。提供的Action仅在创建后对实例执行:
ObjectFactory.Initialize(x =>
{
x.For<IMyService>()
.Use<MyInstance>()
.OnCreation(x => x.Context = MyService.Context;
});
或者您可以使用延迟初始化并为Func
方法提供Use
,该方法在需要新实例时执行。这应该在正确的上下文中执行:
ObjectFactory.Initialize(x =>
{
x.For<IMyService>()
.Use<MyInstance>(() => new MyInstance(MyService.Context);
});
我希望其中一种方法适合你。
答案 1 :(得分:0)
如果MyService具有IContext的ctor参数:
For<IContext>().Add(c => MyService.Context).Named("context");
For<IMyService>().Use<MyService>()
.Ctor<IContext>().Is(c => c.GetInstance<IContext>("context"));
或者如果您想默认所有dependees的上下文:
For<IContext>().Use(() => MyService.Context);
For<IMyService>().Use<MyService>();
lambda表达式在两种情况下都会导致在请求MyService实例时解析上下文。