Сегодня я пытался настроить как можно более простое использование structureMap версии 3.1.0.133 в консольном приложении Windows.

Мне не удается заставить метод WithDefaultConventions работать должным образом. У меня есть класс Member, реализующий интерфейс IMember. StructureMap регистрирует конкретный класс Member, как и ожидалось, с использованием явного cfg.For<>..Use<>, но мне должно быть что-то не хватает при настройке .WithDefaultConventions.

    private void Init()
    {
        ObjectFactory.Initialize(cfg =>
        {
            cfg.Scan(scan =>
            {
                //scan.AssembliesFromApplicationBaseDirectory();
                scan.TheCallingAssembly();

                // named assembly not found ?
                //scan.Assembly("myApp");
                scan.WithDefaultConventions();
            });

            //cfg.For<IMember>().Use<Member>();
     }

Без .For <> эта строка приводит к ошибке

IMember member = ObjectFactory.GetInstance<IMember>();

Как я могу заставить StructureMap «видеть» вызывающую сборку и выполнять регистрацию на основе соглашения?

0
Rakesh Sharma 27 Авг 2014 в 01:02

2 ответа

Лучший ответ

Попробуйте использовать AppDomain.CurrentDomain.GetAssemblies (), чтобы увидеть, что в настоящее время загруженные сборки содержат «MyApp».

Вы также можете попробовать это:

  1. Добавьте в решение проект библиотеки классов («Модели»)
  2. Переместите свои «IMember» и «Member» (и удалите из консольного проекта)
  3. Добавьте ссылку на «Модели» в свой консольный проект.
  4. Затем используйте

scan.Assembly("Models");

В вашей программе инициализации.

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

Надеюсь это поможет...

1
DB Conner 27 Авг 2014 в 05:54
Спасибо - это сработало как шарм. Но я до сих пор не знаю, почему TheCallingAssembly не нашел классы при сканировании того же интерфейса/класса.
 – 
Rakesh Sharma
27 Авг 2014 в 05:51
Вы видели сборку, которую изначально пробовали, когда использовали AppDomain.CurrentDomain.GetAssemblies()?
 – 
DB Conner
27 Авг 2014 в 05:56
Используя System.Reflection; var assms = Appdomain.CurrentDomain.GetAssemblies(); foreach (asm в assms) { Debug.Writeline (asm, FullName); }
 – 
DB Conner
27 Авг 2014 в 06:01

Кроме того, убедитесь, что вы не используете расширение в строке, ссылающейся на имя сборки.

-1
Raj Gupta 27 Авг 2014 в 06:17