2016-06-15 1 views
1

У меня есть структура, как так:Unity Загрузчик для ASP.NET MVC (по соглашению) не в состоянии построить интерфейсы в другом проекте

  • MyWork.BLL
  • MyWork.DAL
  • MyWork. Интерфейсы
  • MyWork.Models
  • MyWork.Web

У меня есть единство по настройка соглашения в проекте MyWork.Web. Он отлично работает, когда я оставляю Service.cs и IService.cs в MyWork.BLL. Я пытаюсь переместить IService.cs в MyWork.Interfaces для организации и развязки. Таким образом, при работе над веб-проектом, все, о чем я должен беспокоиться, - это кодирование против интерфейса и добавление используемой записи для MyWork.Interfaces. Однако, если я попытаюсь переместить IService.cs в проект интерфейса, Unity по соглашению больше не работает. Кто-нибудь знает, возможно ли это? Должен ли я всегда поддерживать интерфейс и его реализацию в рамках одного проекта, чтобы Unity по правилам работала правильно? Вот мой код для единства по соглашению:

public static void RegisterTypes(IUnityContainer container) 
    { 
      container.RegisterTypes(
      AllClasses.FromLoadedAssemblies(), 
      WithMappings.FromMatchingInterface, 
      WithName.Default); 
    } 

Здесь ошибка:

Текущий тип, MyWork.Interfaces.IService, является интерфейсом и не может быть построен. Вам не хватает картографирования типов?

Обновление:

UnityConfig.cs под App_Start из MyWork.Web

namespace MyWork.Web.App_Start 
{ 
public class UnityConfig 
{ 
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 
     RegisterTypes(container); 
     return container; 
    }); 

    public static IUnityContainer GetConfiguredContainer() 
    { 
     return container.Value; 
    } 

    public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ICalculatorService, Interfaces.ICalculatorService>(); // added this per suggested answer 

     container.RegisterTypes(
      AllClasses.FromLoadedAssemblies(), 
      WithMappings.FromMatchingInterface, 
      WithName.Default); 
    } 
} 

}

ответ

0

небось MyWork.Interfaces сборки еще не был загружен. Unity's FromLoadedAssemblies вызывает просто вызовы AppDomain.CurrentDomain.GetAssemblies(), которые по определению возвращают только собранные сборки (не все ссылочные сборки!).

Есть два варианта здесь:

  1. Эталонные типа в MyWork.Interfaces сборки в явном виде в ваших RegisterTypes методов. Это гарантирует загрузку сборки.
  2. Позвонить System.Web.Compilation.BuildManager.GetReferencedAssemblies() перед тем, как позвонить container.RegisterTypes. Вызов GetReferencedAssemblies() загрузит все сборки, которые находятся в папке веб-приложений/bin. Это гарантирует, что не только ваш проект Interfaces, но все проекты загружены.
+0

Благодарим вас за помощь. Вариант 1 отлично работает для меня. Однако опция 2 возвращает сообщение об ошибке «Этот метод не может быть вызван во время фазы инициализации перед запуском приложения». Я пробовал это выше типа регистра, а также помещал его в файл global.aspx. – NKD

+0

Моя мысль о варианте 1 - я использую в настоящее время регистр единства по функции условных обозначений, и если я должен явно указать его внутри метода RegisterTypes ... он несколько побеждает цель «зарегистрироваться по соглашению». Вот почему я упоминаю в комментарии выше Вариант 1 работает для меня, но я все еще хочу изучить вариант 2. Я надеюсь, что вы сможете помочь. Заранее спасибо. – NKD

+1

Переместите регистрацию Unity на более позднюю точку фазы запуска приложения.Например, для Application_Start. – Steven

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