2012-05-10 64 views
8

Tôi đang cố gắng đăng ký một dll có tên "BigEye.Business" và tham chiếu tệp đó cho dự án mvc 3. Nhưng khi tôi cố gắng để có được dụ của một đối tượng trong dll đó, autofac nói nó không được đăng ký. Dưới đây là làm thế nào tôi đăng ký và giải quyết các đối tượng:Tự động đăng ký dll bằng 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>(); 
      } 

     } 

Và khi tôi gọi getInstance chức năng tôi nhận được "Các dịch vụ yêu cầu 'BigEye.Interfaces.Business.IUser' đã không được đăng ký". Tôi có nên đăng ký tất cả các thành phần trong dll kinh doanh? Có cách nào để làm điều đó? Bởi vì các đối tượng và dịch vụ trong Doanh nghiệp sẽ thay đổi theo thời gian.

Cảm ơn

+0

Bạn không chỉ thêm tham chiếu vào dll của mình trong dự án? –

+1

Tôi cũng có thể làm điều đó nhưng tôi muốn tiêm nó ... – mehmetserif

+0

Đó là những gì 'builder.RegisterAssemblyTypes (dịch vụ);' là nghĩa vụ phải làm, phải không? Tôi sẽ cố gắng bước vào đó nếu bạn có thể để làm ra những gì dòng đó thực sự đang làm. Bạn có bất kỳ kế thừa nào giữa các hội đồng của bạn không, nghĩa là bạn có thể thêm một tham chiếu đến assembly để định nghĩa các giao diện mà assembly kinh doanh của bạn thực hiện ít nhất không? – Rup

Trả lời

8

tôi cho rằng lắp ráp của bạn có chứa một hoặc nhiều hiện thực của giao diện IUser. Bây giờ, khi bạn chạy:

builder.RegisterAssemblyTypes(services); 

mà không cần bất kỳ thông số bổ sung mà bạn đang thực sự đăng ký tất cả các loại trong lắp ráp mà keyed bởi lớp. Có thể bạn sẽ thấy rằng quyết tâm này hoạt động:

GetInstance<SomeSpecificUserImplementation>(); 

Để chìa khóa dịch vụ của bạn bởi giao diện, chỉ cần làm như sau:

builder.RegisterAssemblyTypes(services).AsImplementedInterfaces(); 

Bây giờ tất cả các dịch vụ của bạn sẽ được keyed bởi các giao diện họ thực hiện thay vì lớp cụ thể, do đó, những việc sau sẽ hoạt động:

GetInstance<IUser>(); 
Các vấn đề liên quan