使用StructureMap创建需要构造函数参数的类实例

3
我有以下类:

public class AllowanceManager : IAllowanceManager
{
    public AllowanceManager(ITranslationManager t_Manager, ISessionManager s_Manager)
    {...}
}

public class TranslationManager : ITranslationManager
{
    public TranslationManager(string culture) 
    {...}
}

public class SessionManager : ISessionManager
{
    public SessionManager(string key) 
    {...}
}

我该如何在ObjectFactory中初始化这些类,以便获取IAllowanceManager实例时也自动装配和初始化(使用构造函数参数)StateManager和TranslationManager。这样我只需要像下面这样检索IAllowanceDeduction的实例:

IAllowanceManager a_Manager = ObjectFactory....// Gets Allowancemanager configured    with initialized instances of IStateManager and ITranslationManager
3个回答

1

编辑:更短。

将此代码放入您的引导程序中:

ForRequestedType<IAllowanceManager>().TheDefault.Is
       .ConstructedBy(() => new Allowancemanager(new StateManager(), new TranslationManager()));

这里的arg1和arg2分别是ITranslationManager和ISessionHelper的实例吗? - Waliaula Makokha
请解释一下StateManager和TranslationManager是如何构造的,因为我看不到您传递所需的“culture”和“key”参数。 - Waliaula Makokha

1

使用2.6.1语法,它可以这样写:

For<ISessionManager>().Use<SessionManager>()
  .Ctor<string>("key").Is(c => GetSessionKey());
For<ITranslationManager>().Use<TranslationManager>()
  .Ctor<string>("culture").Is(c => Thread.CurrentThread.CurrentCulture.Name);
For<IAllowanceManager>.Use<AllowanceManager>();

GetSessionKey函数以类似于解析语言环境的方式返回您的会话密钥。

有关如何解析构造函数参数的更详细说明,请参见博客条目


这些类型被注册在一个注册表类中,该类不在范围内以检索键和区域设置参数。当实例被检索时,这些参数是可用的。 - Waliaula Makokha
@Waliaula,会话密钥和文化是从哪里来的?哪个对象可以访问这些值? - PHeiberg
这些数据来自于页面上的查询字符串访问。现在为什么你的解决方案不起作用是因为映射是在注册表类中完成的,然后将其添加到global.asax文件中的Objectfactory中。这意味着在设置期间我无法访问“key”和“culture”映射,但在运行时检索实例时我可以访问它们。请查看我的下面的答案。 - Waliaula Makokha
@Waliaula - 在我的示例中,将c => Thread.CurrentThread.CurrentCulture.Name替换为HttpContext.Current.Request["culture"],然后您就可以开始了。虽然在这种情况下我不建议使用这种方法。在我看来,更好的方法是将请求调用封装在某个提供程序类中,并将其注入到TranslationManager中。 - PHeiberg

0
我想出了以下解决方案:
IStateManager stateManager = ObjectFactory
    .With<string>("key")
    .GetInstance<IStateManager>();

ITranslationManager translationManager = ObjectFactory
    .With<string>("culture")
    .GetInstance<ITranslationManager>();

manager = ObjectFactory
    .With<ITranslationManager>(translationManager)
    .With<IStateManager>(stateManager)
    .GetInstance<IAllowanceDeductionManager>();

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