У меня есть структура, как так: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);
}
}
}
Благодарим вас за помощь. Вариант 1 отлично работает для меня. Однако опция 2 возвращает сообщение об ошибке «Этот метод не может быть вызван во время фазы инициализации перед запуском приложения». Я пробовал это выше типа регистра, а также помещал его в файл global.aspx. – NKD
Моя мысль о варианте 1 - я использую в настоящее время регистр единства по функции условных обозначений, и если я должен явно указать его внутри метода RegisterTypes ... он несколько побеждает цель «зарегистрироваться по соглашению». Вот почему я упоминаю в комментарии выше Вариант 1 работает для меня, но я все еще хочу изучить вариант 2. Я надеюсь, что вы сможете помочь. Заранее спасибо. – NKD
Переместите регистрацию Unity на более позднюю точку фазы запуска приложения.Например, для Application_Start. – Steven