2012-05-10 155 views
8

我想註冊一個名爲「BigEye.Business」的dll並將該文件引用到mvc 3項目。但是,當我嘗試獲取該DLL中的對象的實例時,autofac說它沒有註冊。這是我如何註冊和解析的對象:Autofac註冊DLL使用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>(); 
      } 

     } 

當我打電話的GetInstance功能我得到「所請求的服務‘BigEye.Interfaces.Business.IUser’尚未註冊」。我應該註冊Business dll中的所有組件嗎?有沒有辦法做到這一點?因爲Business中的對象和服務會隨時間而改變。

感謝

+0

你不能只是在項目中添加一個對你的DLL的引用? –

+1

那麼我可以做到這一點,但我想注入它...... – mehmetserif

+0

這就是'builder.RegisterAssemblyTypes(services);'應該做的,不是嗎?如果你能確定這條線實際上在做什麼,我會嘗試進入。您的程序集之間是否有任何繼承關係,即,您是否可以添加對組件的引用,以定義您的業務程序集至少實現的接口? – Rup

回答

8

我假設你的組件包含IUser接口的一個或多個實現。現在,當你運行:

builder.RegisterAssemblyTypes(services); 

沒有任何額外的參數,你實際上是註冊各類由類鍵入該程序集。你可能會看到這個決心的工作原理:

GetInstance<SomeSpecificUserImplementation>(); 

爲了通過接口來鍵入您的服務,只需做到以下幾點:

builder.RegisterAssemblyTypes(services).AsImplementedInterfaces(); 

現在所有的服務都將受到接口被鍵入他們實現而不是具體的類,因此以下將工作:

GetInstance<IUser>();