首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >StructureMap 3获取请求类型

StructureMap 3获取请求类型
EN

Stack Overflow用户
提问于 2014-09-30 04:31:45
回答 2查看 578关注 0票数 3

我在2.6.4版中注册了下面的StructureMap,最后升级到最新的SM (撰写本文时为3.1.2)。并且需要更新它,因为现在似乎已经没有IContext.BuildStack了。

以下是2.6.4的旧工作版本:

代码语言:javascript
运行
复制
        initialization.For(typeof(IRepository<,>))
                             .Use(context =>
                             {
                                 var genericArgs = context.BuildStack.Current.RequestedType.GetGenericArguments();

                                 return RepositoryFactory.GetInstance(genericArgs[0], genericArgs[1], repositoryName);
                             }
            );

所以我想把它改成这个会有用的:

代码语言:javascript
运行
复制
        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,这显然不是我想要的。

我获得这个存储库实例的测试代码是:

代码语言:javascript
运行
复制
var userRepository = ObjectFactory.GetInstance<IRepository<User, Guid>>();

我没有看到任何其他财产有这方面的信息,但我猜我错过了一些东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-06 18:44:04

你没有错过什么东西。在GitHub上,有人发布了一个模拟问题:https://github.com/structuremap/structuremap/issues/288。“结构图”的作者杰里米·米勒回答道:

这将是一个新的发展。它必须有一个3.2版本。

建议的解决方法是创建一个自定义实例并重写ClosingType方法。您可以这样做:

代码语言:javascript
运行
复制
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<,>); }
    }
}

现在,只需将打开的泛型类型连接到关闭类型,如下所示:

代码语言:javascript
运行
复制
initialization.For(typeof (IRepository<,>)).Use(new CustomInstance());
票数 6
EN

Stack Overflow用户

发布于 2014-10-07 12:55:22

我根据您的问题向StructureMap 3代码基添加了一个新示例:

type.cs

不过,我不得不问,如果您使用的是RepositoryBuilder容器,那么像IoC这样的东西的目的是什么?

无论如何,这个实现应该比旧的重反射方法更有效。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26112828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档