2012-05-10 157 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>();