问题:
我很难让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有以下构造函数:
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。
我想知道:
问题:
设置:
我有以下的注册课程:
public class IocRegistry : Registry
{
public IocRegistry()
{
this.For(typeof(IRepository<>)).Use(typeof(MongoRepository<>))
.CtorDependency<string>("connectionString")
.Is("MongoServerSettings");
}
}以及以下容器初始化:
public static IContainer Initialize() {
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.LookForRegistries();
scan.WithDefaultConventions();
});
});
return ObjectFactory.Container;
}当我在IocRegistry的构造函数中放置一个断点并调试应用程序时,它肯定会受到攻击。
消耗IRepository<>的代码是:
public class ImageContentService : IImageContentService
{
private IRepository<ImageItem> imageRepository;
public ImageContentService(IRepository<ImageItem> imageRepository)
{
this.imageRepository = imageRepository;
}
}ObjectFactory.Container.WhatDoIHave()的相关输出(一旦所有注册完成)是:
===========================================================================================================
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发布于 2014-02-13 15:56:05
您可以告诉StructureMap使用哪个构造函数:
x.SelectConstructor<ClassWithTwoConstructors>(()=>new ClassWithTwoConstructors(0));您可以在StructureMap文档中找到这个。
发布于 2014-02-18 13:41:05
我也有过同样的问题。最后,我通过在MongoRepository初始化中配置ObjectFactory来解决这个问题,如下所示:
x.For<IRepository<T>>().Use(() => new MongoRepository<T>("{ConnectionString}","{CollectionName}"));这样看来,结构映射似乎使用了正确的构造函数。显然,您可以使用您喜欢的任何构造函数实例化MongoRepository。
https://stackoverflow.com/questions/21550759
复制相似问题