2012-05-10 14 views
8

Próbuję zarejestrować dll o nazwie "BigEye.Business" i odwołuje się do tego pliku do projektu mvc 3. Ale kiedy próbuję uzyskać instancję obiektu w tej bibliotece, autofac mówi, że nie jest zarejestrowany. Oto w jaki sposób mogę się zarejestrować i rozwiązać obiektu:Autofac zarejestrować dll przy użyciu Assembly.Load

private static IContainer SetDIContainer() 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
      builder.RegisterType<UserAuthManager>().As<IUserAuth>().InstancePerHttpRequest(); 
      builder.RegisterType<SessionManager>().As<ISession>().InstancePerHttpRequest(); 


      //Here is the code to register that dll 
      var services = Assembly.Load("BigEye.Business"); 
      builder.RegisterAssemblyTypes(services); 
      IContainer container = builder.Build(); 
      DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

      return container; 
     } 

     public static T GetInstance<T>() 
     { 
      IContainer container = SetDIContainer(); 

      using(var httpRequestScope = container.BeginLifetimeScope("httpRequest")) 
      { 
       return httpRequestScope.Resolve<T>(); 
      } 

     } 

i kiedy wywołanie funkcji GetInstance otrzymuję „Żądana usługa«BigEye.Interfaces.Business.IUser»nie została zarejestrowana”. Czy powinienem zarejestrować wszystkie składniki w bibliotece dll? Czy jest jakiś sposób na zrobienie tego? Ponieważ obiekty i usługi w Biznesie będą się zmieniać w czasie.

Dzięki

+0

Czy możesz nie tylko dodać odniesienie do biblioteki DLL w projekcie? –

+1

Cóż, mogę to zrobić, ale chcę go wstrzyknąć ... – mehmetserif

+0

To właśnie powinno robić 'builder.RegisterAssemblyTypes (services) ;, czyż nie? Próbowałbym się do tego przyłożyć, jeśli potrafimy zrozumieć, co właściwie robi ta linia. Czy posiadasz dziedziczenie między złożeniami, tzn. Czy możesz dodać odniesienie do zespołu, który definiuje interfejsy, które przynajmniej twój zestaw biznesowy implementuje? – Rup

Odpowiedz

8

Zakładam, że zespół zawiera jeden lub więcej implementacje interfejsu IUser. Teraz, po uruchomieniu:

builder.RegisterAssemblyTypes(services); 

bez żadnych dodatkowych parametrów, które są faktycznie rejestrowanie wszystkich rodzajów w tym zespole zamocowanej przez klasy. Prawdopodobnie będziesz zobaczyć, że to postanowienie działa:

GetInstance<SomeSpecificUserImplementation>(); 

W celu kluczowania usługi przez interfejs, wystarczy wykonać następujące czynności:

builder.RegisterAssemblyTypes(services).AsImplementedInterfaces(); 

Teraz wszystkie usługi będą włączył przez interfejsy one implementuj zamiast konkretnej klasy, a więc będą działać:

GetInstance<IUser>(); 
Powiązane problemy