继我之前关于如何在结构图中实现 IContainer 的帖子之后,我已经解决了我希望这是我一段时间内的最后一个问题。
如何将额外的(非 Structuremap 注入(inject)的)对象传递到构造函数中?
让我们从我用来测试这些内容的示例控制台应用程序中获取以下内容。
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>();
我的问题是如何以最简单的方式做到这一点?
我找到了这个链接,但看不到如何使用这些建议,因为我必须让我的调用类知道 UserService 的依赖关系。如您所见,其中一些是数据层项目,我不想将它们告诉我的 UI 层。
http://structuremap.github.io/resolving/passing-arguments-at-runtime/
请您参考如下方法:
您应该能够像这样定位您的参数:
this.For<IUserService>().Use<UserService>().Ctor<string>("randomParam").Is("YourValue");
虽然这可行,但值得一提的是,如果您要注入(inject)的参数与任何类型的业务逻辑、配置相关联,或者即使它的值基于特定条件,那么我建议创建一个构建器类作为代理(similar to this answer)并封装决定字符串值的逻辑并将其注入(inject)。
当像这样注入(inject)字符串时,您必须小心不要将您的业务逻辑放在错误的位置。
