我有以下适用于 2.6.4 版的 StructureMap 注册,我终于升级到最新的 SM(在撰写本文时为 3.1.2)。并且需要更新它,因为似乎不再有 IContext.BuildStack 了。
这是 2.6.4 的旧工作版本:
initialization.For(typeof(IRepository<,>))
.Use(context =>
{
var genericArgs = context.BuildStack.Current.RequestedType.GetGenericArguments();
return RepositoryFactory.GetInstance(genericArgs[0], genericArgs[1], repositoryName);
}
);
所以我想把它改成这样会起作用:
initialization.For(typeof (IRepository<,>))
.Use("IRepository<,>", context =>
{
var genericArgs = context.ParentType.GetGenericArguments();
return RepositoryFactory.GetInstance(genericArgs[0], genericArgs[1],
repositoryName);
}
);
但是 context.ParentType 为空。当我查看 context.RootType 时,它被设置为 System.Object,这显然不是我想要的。
我获取此存储库实例的测试代码是:
var userRepository = ObjectFactory.GetInstance<IRepository<User, Guid>>();
我没有看到任何其他包含此信息的属性,但我猜我遗漏了一些东西。
最佳答案
你没有错过什么。在 GitHub 上有人发布了一个类似的问题: https://github.com/structuremap/structuremap/issues/288 。
Structuremap 的作者 Jeremy Miller 回应道:
建议的解决方法是创建自定义实例并覆盖 ClosingType 方法。您可以按如下方式执行此操作:
public class CustomInstance : Instance
{
public override IDependencySource ToDependencySource(Type pluginType)
{
throw new NotImplementedException();
}
public override Instance CloseType(Type[] types)
{
var repository = RepositoryFactory.GetInstance(types[0], types[1], repositoryName);
return new ObjectInstance(repository);
}
public override string Description
{
get { throw new NotImplementedException(); }
}
public override Type ReturnedType
{
get { return typeof (IRepository<,>); }
}
}
现在,您只需要将开放泛型类型连接到关闭类型,如下所示:
initialization.For(typeof (IRepository<,>)).Use(new CustomInstance());
关于StructureMap 3 获取请求的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26112828/