2016-12-15 6 views
1

Я пытаюсь реализовать демо-приложение для понимания Unity и IoC. Но я как бы ударил.Unity и IoC не работает

У меня ошибка:

An error occurred when trying to create a controller of type 'ProductController'. Make sure that the controller has a parameterless public constructor.

Вот краткий обзор того, что я делаю:

У меня есть пять проектов:

  1. Модель данных
  2. Бизнес Услуги
  3. WebApi
  4. Бизнес Сущность
  5. резольвера

Я после этого кода проекта урока: https://www.codeproject.com/articles/997216/restful-day-sharp-resolve-dependency-of-dependenci

Я завершил день 3. но я не в состоянии решить эту проблему.

Это моя WebApi Функция Unity RegisterTypes.

public static void RegisterTypes(IUnityContainer container) 
{ 
    // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
    // container.LoadConfiguration(); 

    // TODO: Register your types here 
    //container.RegisterType<IProductServices, ProductServices>(); 

    //Component initialization via MEF 
    ComponentLoader.LoadContainer(container, ".\\bin", "WebApi.dll"); 
    ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll"); 
} 

Вот ProductController Конструктор

public class ProductController : ApiController 
{ 
    private readonly IProductServices _productServices; 

    #region Public Constructor 

    /// <summary> 
    /// Public constructor to initialize product service instance 
    /// </summary> 
    public ProductController(IProductServices productServices) 
    { 
     _productServices = productServices; 
    } 

    #endregion 

BusinessServices проект регистрации зависимостей в DependencyResolver класса

using Resolver; 
using System.ComponentModel.Composition; 

namespace BusinessServices 
{ 
    [Export(typeof(IComponent))] 
    public class DependencyResolver : IComponent 
    { 
     public void SetUp(IRegisterComponent registerComponent) 
     { 
      registerComponent.RegisterType<IProductServices, ProductServices>(); 
     } 
    } 
} 

Кто-нибудь может мне помочь?

Спасибо!

+0

ну, у вас есть конструктор с параметром less в типе ProductController? –

+0

Нет, поскольку я использую Unity и IoC, я думаю, что он разрешит это. (он должен использовать схему впрыска базы конструктора) – Saadi

+0

Зарегистрирована ли служба «IProductServices»? –

ответ

0

Вы должны зарегистрировать необходимые типы:

 container.RegisterType<ProductController>(); 
     container.RegisterType<IProductServices, ProductServices>(); 

при условии, что вы реализовали IDependencyResolver.GetService используя ваш Unity container, например:

public object GetService(Type serviceType) 
    { 
     if(container.IsRegistered(serviceType)) 
     { 
      return container.Resolve(serviceType); 
     } 
     return null; 
    } 

простой демо можно сделать так:

public class UnityResolver : IDependencyResolver 
{ 
    public IUnityContainer _container; 

    public UnityResolver() 
    { 
     _container = new UnityContainer(); 
     RegisterTypes(_container); 
    } 

    public IDependencyScope BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     if(_container.IsRegistered(serviceType)) 
     { 
      return _container.Resolve(serviceType); 
     } 
     return null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return Enumerable.Empty<object>(); 
    } 

    public void Dispose() 
    { 
    } 

    public static void RegisterTypes(IUnityContainer container) 
    { 
     // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements. 
     // container.LoadConfiguration(); 

     // TODO: Register your types here 
     container.RegisterType<ProductController>(); 
     container.RegisterType<IProductServices, ProductServices>(); 

     //Component initialization via MEF 
     //ComponentLoader.LoadContainer(container, ".\\bin", "WebApi.dll"); 
     //ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll"); 
    } 
} 

и установить преобразователь в Application_Start:

GlobalConfiguration.DependencyResolver = new UnityResolver(); 
+1

Спасибо за ваш ответ, но я хочу спросить, почему мне нужно зарегистрировать свой ProductController? – Saadi

+0

'ProductController' нуждается в регистрации, чтобы преобразователь web api использовал экземпляр, разрешенный контейнером Unity, вместо вызова конструктора по умолчанию. –

+0

Нет, это не работает. Я даже пытаюсь зарегистрировать 'ProductController' – Saadi