我在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>>();我没有看到任何其他财产有这方面的信息,但我猜我错过了一些东西。
发布于 2014-10-06 18:44:04
你没有错过什么东西。在GitHub上,有人发布了一个模拟问题:https://github.com/structuremap/structuremap/issues/288。“结构图”的作者杰里米·米勒回答道:
这将是一个新的发展。它必须有一个3.2版本。
建议的解决方法是创建一个自定义实例并重写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());发布于 2014-10-07 12:55:22
我根据您的问题向StructureMap 3代码基添加了一个新示例:
不过,我不得不问,如果您使用的是RepositoryBuilder容器,那么像IoC这样的东西的目的是什么?
无论如何,这个实现应该比旧的重反射方法更有效。
https://stackoverflow.com/questions/26112828
复制相似问题