使用 StructureMap 传递额外的构造函数参数

Passing additional constructor arguments with StructureMap

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

如何将额外的(非 Structuremap 注入的)对象传递到构造函数中?

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

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

这会引发以下错误,因为我的构造函数具有 randomParam 并且 structuremap 不知道如何填补空白:

An unhandled exception of type 'StructureMap.StructureMapBuildPlanException' occurred in StructureMap.dll

Additional information: Unable to create a build plan for concrete type CommonServices.UserService

构造函数:

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

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

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

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

我找到了这个 link 但看不到如何使用这些建议,因为我必须让我的调用 class 知道 UserService 的依赖关系。如您所见,其中一些是数据层项目,我不想将它们告诉我的 UI 层。

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

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

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

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

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