2014-02-04 1 views
1

Проблема:StructureMap и MongoRepository.1.6.2 .Net 4.5

У меня возникли проблемы с получением StructureMap найти экземпляр по умолчанию для IRepository <> типа в пространстве имен MongoRepostiory.

Сообщение об исключении:

"StructureMap Код исключения: 202 Нет По умолчанию Instance определено для PluginFamily MongoDB.Driver.MongoUrl, MongoDB.Driver, Version = 1.8.3.9, культура = нейтральной, PublicKeyToken = f686731cfb9cc103 "

оказывается, что 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 (строка connectionString); конструктор, который будет вызываться ... но кажется, что из сообщения об исключении, поскольку StructureMap пытается разрешить MongoUrl, он не вызывает желаемый.

Интересно:

Вопросы:

  1. ли я настроить что-то неправильно, которая вызывает неправильный конструктор назвать? или
  2. Является ли это поведением по умолчанию, и если да, то каким образом я могу его изменить, чтобы вызвать нужный конструктор?

установки параметров:

Я следующий класс реестра:

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 
+0

Каков результат работы ObjectFactory.Container.WhatDoIHave()? – ozczecho

+0

Я добавил результат ObjectFactory.Container.WhatDoIHave() – JTech

ответ

1

Вы может указать StructureMap, какой конструктор использовать:

x.SelectConstructor<ClassWithTwoConstructors>(()=>new ClassWithTwoConstructors(0)); 

Вы можете найти это в StructureMap documentation.

0

У меня была такая же проблема.В конце концов я решил, настроив свою MongoRepository в ObjectFactory инициализации так:

x.For<IRepository<T>>().Use(() => new MongoRepository<T>("{ConnectionString}","{CollectionName}")); 

Таким образом, кажется, StructureMap, кажется, использует правильный конструктор. Obviosuly вы можете создать экземпляр MongoRepository с любым конструктором, который вы предпочитаете.

 Смежные вопросы

  • Нет связанных вопросов^_^