首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StructureMap和MongoRepository.1.6.2 .Net 4.5

StructureMap和MongoRepository.1.6.2 .Net 4.5
EN

Stack Overflow用户
提问于 2014-02-04 11:08:25
回答 2查看 369关注 0票数 1

问题:

我很难让StructureMap在MongoRepostiory命名空间中找到IRepository<>类型的默认实例。

异常消息:

“PublicKeyToken=f686731cfb9cc103”StructureMap异常代码:202个未为PluginFamily MongoDB.Driver.MongoUrl、MongoDB.Driver、Version=1.8.3.9、Culture=neutral、MongoDB.Driver定义的默认实例

似乎StructureMap正在用错误的构造函数实例化MonogoRepository类.

MonogoRepository有以下构造函数:

代码语言:javascript
复制
    public class MongoRepository<T> : MongoRepository<T, string>, IRepository<T>, IRepository<T, string>, IQueryable<T>, IEnumerable<T>, IQueryable, IEnumerable where T : MongoRepository.IEntity<string>
{
    public MongoRepository();
    public MongoRepository(MongoUrl url);
    public MongoRepository(string connectionString);
    public MongoRepository(MongoUrl url, string collectionName);
    public MongoRepository(string connectionString, string collectionName);
}

我希望公共MongoRepository(string connectionString);构造函数是called...but --从异常消息来看,由于StructureMap试图解析MongoUrl,所以它没有调用所需的MongoUrl。

我想知道:

问题:

  1. 我是否设置了导致调用不正确构造函数的错误?或
  2. 这是默认行为吗?如果是,如何更改它以确保调用所需的构造函数?

设置:

我有以下的注册课程:

代码语言:javascript
复制
public class IocRegistry : Registry
{
    public IocRegistry() 
    {
        this.For(typeof(IRepository<>)).Use(typeof(MongoRepository<>))
                            .CtorDependency<string>("connectionString")
                            .Is("MongoServerSettings");
    }
}

以及以下容器初始化:

代码语言:javascript
复制
public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.LookForRegistries();
                                    scan.WithDefaultConventions();
                                });
                    });

        return ObjectFactory.Container;
    }

当我在IocRegistry的构造函数中放置一个断点并调试应用程序时,它肯定会受到攻击。

消耗IRepository<>的代码是:

代码语言:javascript
复制
public class ImageContentService : IImageContentService
{
    private IRepository<ImageItem> imageRepository;

    public ImageContentService(IRepository<ImageItem> imageRepository) 
    {            
        this.imageRepository = imageRepository;
    }
}

ObjectFactory.Container.WhatDoIHave()的相关输出(一旦所有注册完成)是:

代码语言:javascript
复制
===========================================================================================================
Configuration Sources:

0)   Registry:  StructureMap.InitializationExpression, StructureMap, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223
1)   Registry:  StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223
2)   Registry:  StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223
3)   Registry:  Mch.Core.IocRegistry, Mch.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null


============================================================================================================================================================================================================================================================================================================================================
PluginType                                                                            Name                                                                                                            Description                                                                                                                           
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IRepository`1<T> (IRepository`1<T>)                                                   d26c76dd-8550-4d02-bf8a-25c6f0075346                                                                            Configured Instance of MongoRepository.MongoRepository`1, MongoRepository.Net45, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null
Scoped as:  Transient

                                                                                      d26c76dd-8550-4d02-bf8a-25c6f0075346                                                                            Configured Instance of MongoRepository.MongoRepository`1, MongoRepository.Net45, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null
EN

回答 2

Stack Overflow用户

发布于 2014-02-13 15:56:05

您可以告诉StructureMap使用哪个构造函数:

代码语言:javascript
复制
x.SelectConstructor<ClassWithTwoConstructors>(()=>new ClassWithTwoConstructors(0));

您可以在StructureMap文档中找到这个。

票数 1
EN

Stack Overflow用户

发布于 2014-02-18 13:41:05

我也有过同样的问题。最后,我通过在MongoRepository初始化中配置ObjectFactory来解决这个问题,如下所示:

代码语言:javascript
复制
x.For<IRepository<T>>().Use(() => new MongoRepository<T>("{ConnectionString}","{CollectionName}"));

这样看来,结构映射似乎使用了正确的构造函数。显然,您可以使用您喜欢的任何构造函数实例化MongoRepository。

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

https://stackoverflow.com/questions/21550759

复制
相关文章

相似问题

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