我有以下适用于 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/

10-12 03:50