【问题标题】:How to have structuremap build instance based on type如何根据类型构建结构图实例
【发布时间】:2010-09-12 04:52:43
【问题描述】:

好的,所以这可能不是最好的标题,但我正在为如何命名它而苦苦挣扎。到目前为止,这是我所拥有的:

我目前有我的对象的数据映射器。我像这样在注册表中定义它们。这允许我获取对象的类型名称并将其与单词 Mapper 组合并请求它。这是我正在使用的代码:

this.For<ICategoryMapper>()
    .Use<CategoryMapper>()
    .Named("CategoryMapper");

但是现在我从 StructureMap 以我可以使用的形式获取实例时遇到问题。因为我不能用这样的代码像往常一样请求它:

ObjectFactory.GetNamedInstance<T>(namedInstance);

原因是我真的不知道类型。我只知道它应该是 DomainType 名称加上单词映射器。可能有更好的方法来实现这一点,但我不知道该怎么做。

为实现这一目标或解决我遇到的问题提供更好的方法。

【问题讨论】:

    标签: dependency-injection inversion-of-control structuremap


    【解决方案1】:

    您是否需要使用命名实例,还是只是为了让它工作?

    您可以做的一种方法是添加一个标记接口,该接口声明映射器使用的 DomainType。例如:

    public class PersonMapper : ICategoryMapper, ICategoryMapper<Person>{
    }
    

    向容器注册映射器:

    ObjectFactory.Initialize(x =>
    {
        x.Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.ConnectImplementationsToTypesClosing(typeof (ICategoryMapper<>));
            scan.AddAllTypesOf<ICategoryMapper>();
        });
    });
    

    然后您可以为您的 DomainType(例如 Person)检索映射器:

    ObjectFactory.ForGenericType(typeof(ICategoryMapper<>))
      .WithParameters(typeof(Person))
      .GetInstanceAs<ICategoryMapper>();
    

    【讨论】:

    • +1 是的,使用命名实例只是我可以让它工作的一种方式。我最终创建了一个非通用接口并分配给基类。然后用它来定义所有类型。这是我所做的: this.For().Use().Named("CategoryMapper");尽管您在这里所拥有的似乎要好得多,并且使我不必在每次创建新映射器时都添加新条目。今晚我一定会试一试,看看这是否能满足我的需要。
    猜你喜欢
    • 2019-09-24
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多