继我之前关于如何在结构图中实现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/
答案 0 :(得分:9)
您应该可以像这样定位参数:
this.For<IUserService>().Use<UserService>().Ctor<string>("randomParam").Is("YourValue");
虽然这会起作用,但值得一提的是,如果您注入的参数与任何类型的业务逻辑,配置相关联,或者即使它基于某些条件的值,那么我建议创建一个充当proxy(similar to this answer)并封装了决定字符串值的逻辑并将其注入。
注入这样的字符串时,必须注意不要将业务逻辑放在错误的位置。