2013-04-21 25 views
8

ile çalışıyorum ASP.Net MVC 4 Web API denetleyicim Unity.WebApi ile çalışmaz. Aynı projede basit kontrolörler Unity.Mvc3 ile düzgün bir şekilde çalışır. Ama bir ileti alıyorum ApiController türetilen Web API denetleyicisi çalıştırdığınızda:ASP.Net MVC 4 Web API denetleyicisi ile çalışma Unity.WebApi

{ "$ id": "1", "Mesaj": "Bir hata oluştu", "ExceptionMessage":" ": "System.ArgumentException", "StackTrace": "Tip 'ElectricTests.Controllers.Api.DocumentsController' bir varsayılan yapıcı"," ExceptionType yok System.Linq.Expressions.Expression.New de (Tip tip) \ r \ n System.Web.Http.Internal.TypeActivator.Create [tbase] (Tip instancetype de) \ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator de (HttpRequestMessage istek, Tip kontrol Tip, Func`1 & aktivatörü) \ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create de (HttpRequestMessage isteği HttpControllerDescriptor controllerDescriptor, Tip controllerType) "}

My ApiController:

public class DocumentsController : ApiController 
{ 
    private readonly IDocumentsRepository _repository; 

    public DocumentsController(IDocumentsRepository repository) { 
     _repository = repository; 
    } 

    public IEnumerable<FormattedDocument> GetFormattedDocuments() 
    { 
     return _repository.GetAllFormattedDocuments(); 
    } 
    ... 

Bootstrapper.cs:

public static class Bootstrapper { 
    public static void Initialise() { 
     IUnityContainer container = BuildUnityContainer(); 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 

    private static IUnityContainer BuildUnityContainer() { 
     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>();    

     container.RegisterType<IDocumentsRepository, DocumentsRepository>(); 
     container.RegisterType<IQuestionsRepository, QuestionsRepository>(); 
     container.RegisterType<ITestRepository, TestsRepository>(); 

     return container; 
    } 
} 

benim hatadır?

+0

istisna metni: DocumentsController bir varsayılan kurucu –

+0

bu makalede çözüldü bu sorun yok: http://www.asp.net/web-api/overview/extensibility/using-the-web-api-dependency -resolver – Oblomingo

cevap

25

denetleyici ve ApiController ele alınması farklıdır Ben de vardı

DependencyResolver.SetResolver(new Unity.Mvc4.UnityDependencyResolver(container)); 
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); 

Not Bazı eklemek için yapmanız gerekenler:)

Install-Package Unity.MVC4 

ve Unity.WebAPI DI (http://www.nuget.org/packages/Unity.WebAPI/)

Install-Package Unity.WebAPI 

Sizin bootstrapper ikisinin bir kombinasyonu olmalıdır

container.RegisterInstance(typeof (HttpConfiguration), GlobalConfiguration.Configuration); 
için Yardım sayfasını almak için kayıt olun.

Unity.MVC4'ün sahibi olarak WebApi'yi kütüphanemize dahil etmeyi düşünüyorum.

+0

Bu cevap Unity ve WebApi Controller ile olan sorunumu çözdü, teşekkürler @Oliver. – Jenan

0

ASP.NET Web API için Unity yüklediğinizde, öyle

Bootstrapper.Initialise(); 

Yani Application_Start yöntemine eklemek gerekir

sizin Global.asax aşağıdaki satırı ekleyin hariç herşey:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    Bootstrapper.Initialise(); 

    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 
I denetleyici DI Unity.MVC4 kütüphane kullanımı

(: tamamen farklı baz sınıfları olarak