2014-01-09 5 views
0

У меня есть контроллер api, который я хочу зарегистрировать во время выполнения в моем приложении mvc. Самого контроллера находится в проект библиотек классов и выглядит следующим образом:Регистрация пользовательского контроллера во время выполнения

public class CustomController : ApiController 
{ 
    public string Get() 
    { 
     return "Hello"; 
    }  
} 

Я скомпилировать эту библиотеку (дал ему имя Injection.dll), и в моем MVC приложения попытается зарегистрировать этот контроллер с помощью библиотеки контейнера Unity.Mvc

public static class UnityConfig 
{ 
    public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 

     // register all your components with the container here 
     // it is NOT necessary to register your controllers 

     // e.g. container.RegisterType<ITestService, TestService>(); 

     Assembly customLogicAssembly = Assembly.LoadFrom(HttpContext.Current.Server.MapPath("~/bin/" + "Injection.dll")); 
     Type existingType = customLogicAssembly.GetTypes().First(); 
     container.RegisterType(existingType); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 
} 

Таким образом, кажется, что регистрация работает нормально, и я не имеют ошибок при debuggig, но я не ожидал результата, когда я перейти к API/Пользовательский/Get я есть The resource cannot be found. ошибку в браузер. Помогите нам пропустить здесь.

+0

Вы настроены 1. маршруты для веб-api? 2. фабрика контроллера единства для вашего прилагаемого пользовательского контроллера api? –

ответ

2

MVC и Web API имеют свой собственный зависимый преобразователь.

Ваш код регистрируя MVC Dependeny Резольвер:

DependencyResolver.SetResolver(yourResolver); 

Что вам нужно зарегистрировать это Web API Dependency распознаватель, как это:

GlobalConfiguration.Configuration.DependencyResolver = yourResolver; 

Ожидаемое распознаватель в обоих случаях необходимо реализовать IDependencyResolver, но он служит другой цели.

Не рекомендуется использовать один и тот же зависимый преобразователь (таким образом, контейнер и корень композиции) для обеих вещей. Если вам нужно это сделать, используйте два разных экземпляра IDependencyResolver и зарегистрируйте контроллеры, к которым они принадлежат.

ВАЖНО Есть два различных IDependencyResolver интерфейсов, один для MVC, а другой для Web API. Они имеют одно и то же имя, но находятся на разных пространствах имен. И вам нужно реализовать соответствующий для каждого случая (или оба, если вам нужно реализовать DI как для MVC и Web API):

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