使用StructureMap传递其他构造函数参数

时间:2015-01-22 22:09:04

标签: c# .net inversion-of-control structuremap structuremap3

继我之前关于如何在结构图中实现IContainer的帖子之后,我已经打了一段时间,希望是我的最后一个问题。

如何将其他(非结构图注入)对象传递给构造函数?

让我从我用来测试这些东西的示例控制台应用程序中取出以下内容。

static void Main(string[] args)
{
     _container = StructureMapConfig.GetContainer();
     _userService = _container.GetInstance<IUserService>();
}

这会抛出以下错误,因为我的构造函数有randomParam,而structuremap不知道如何填补空白:

  

StructureMap.dll中发生未处理的“StructureMap.StructureMapBuildPlanException”类型异常

     

其他信息:无法为具体类型CommonServices.UserService

创建构建计划

构造

public UserService(IUserRepository userRepository, IStringService stringService, string randomParam)
{
    _userRepository = userRepository;
    _stringService = stringService;
}

在我的注册表中,我定义了我的用户服务:

 this.For<IUserService>().Use<UserService>();

我的问题是如何以最简单的方式做到这一点?

我找到了这个链接,但看不到如何使用这些建议,因为我必须让我的调用类知道UserService的依赖关系。您可以看到其中一些是数据层项目,我不想告诉我的UI层。

http://structuremap.github.io/resolving/passing-arguments-at-runtime/

1 个答案:

答案 0 :(得分:9)

您应该可以像这样定位参数:

this.For<IUserService>().Use<UserService>().Ctor<string>("randomParam").Is("YourValue");

虽然这会起作用,但值得一提的是,如果您注入的参数与任何类型的业务逻辑,配置相关联,或者即使它基于某些条件的值,那么我建议创建一个充当proxy(similar to this answer)并封装了决定字符串值的逻辑并将其注入。

注入这样的字符串时,必须注意不要将业务逻辑放在错误的位置。