2

继我之前发布的关于如何在结构映射中实现 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/

4

1 回答 1

10

您应该能够像这样定位您的参数:

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

虽然这会起作用,但值得一提的是,如果您注入的参数与任何类型的业务逻辑、配置相关,或者即使它的值基于某些条件,那么我建议创建一个充当代理的构建器类(类似到这个答案)并封装决定字符串值的逻辑并注入它。

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

于 2015-01-23T09:08:02.513 回答