在StructureMap中注册默认实例

时间:2011-07-04 05:56:07

标签: c# ioc-container structuremap

我有一个类(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()但是在构造对象之后它被解雇而不是而不是

2 个答案:

答案 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实例时解析上下文。