22

Tôi mới đến Autofac (không phải DI). Đây là tình hình:Cách đăng ký nhiều tài khoản mở chung trong Autofac

tôi có các giao diện:

public interface IQuery<out TResult> : IQuery { } 

public interface IQueryHandler<in TQuery, out TResult> where TQuery : IQuery<TResult> { 
    TResult Handle(TQuery query); 
} 

và có rất nhiều thực hiện chúng trong dung dịch của tôi:

class GetPersonQuery : IQuery<PersonModel> { } 
class GetPersonQueryHandler : IQueryHandler<GetPersonQuery, PersonModel> { } 

class GetArticleQuery : IQuery<ArticleModel> { } 
class GetArticleQueryHandler : IQueryHandler<GetArticleQuery, ArticleModel> { } 

class GetSomethingQuery : IQuery<IEnumerable<SomeModel>> { } 
class GetSomethingQueryHandler : IQueryHandler<GetSomethingQuery, IEnumerable<SomeModel>> { } 

và vân vân. Tôi hiện đang đăng ký chúng như thế này:

builder.RegisterType<GetPersonQueryHandler>() 
    .As<IQueryHandler<GetPersonQuery, PersonModel>>(); 

builder.RegisterType<GetArticleQueryHandler>() 
    .As<IQueryHandler<GetArticleQuery, ArticleModel>>(); 

builder.RegisterType<GetSomethingQueryHandler>() 
    .As<IQueryHandler<GetSomethingQuery, SomeModel>>(); 

// blah blah blah 

Như bạn có thể thấy, tôi có nhiều đăng ký giống nhau. Trong SimpleInjector (mà tôi đã sử dụng trước đó), tôi có thể đăng ký tất cả trong số họ bởi một dòng duy nhất:

container.RegisterManyForOpenGeneric(
    typeof(IQueryHandler<,>), 
    AppDomain.CurrentDomain.GetAssemblies()); 

Có thể làm công cụ này trong Autofac?

+3

Không đơn giản hơn Injector? Điều đó làm tôi buồn: '( – Steven

+1

Xin lỗi): Tôi đang làm việc với nhóm @ Javad_Amiry (Kavand). Đó là vì vấn đề mà Javad_Amiry đã hỏi trước đây (ở đây và trên codeplex). Thật không may trong dự án này, chúng tôi không thể sử dụng vòi phun đơn giản. Nhưng DI lib chính của chúng tôi vẫn là SimpleInjector. Chúng tôi đã sử dụng nó trong nhiều dự án và chúng tôi sẽ tiếp tục sử dụng nó. :) –

Trả lời

32

Bạn có thể làm điều này với Autofac bạn chỉ cần sử dụng scanning feature và sử dụng các phương pháp AsClosedTypesOf:

AsClosedTypesOf(open) - đăng ký loại có thể chuyển nhượng cho một trường hợp khép kín của các loại generic mở.

Vì vậy, đăng ký của bạn sẽ trông như thế này:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) 
     .AsClosedTypesOf(typeof (IQueryHandler<,>)).AsImplementedInterfaces(); 
+0

Hoạt động hoàn hảo. Cảm ơn rất nhiều –

+0

Bạn có cần cuộc gọi AsImplementedInterfaces hoặc không AsClosedTypes đăng ký loại là loại đóng u qua nó? – Sam

+3

@Sam nếu bạn muốn giải quyết với loại lặp lại, ví dụ: với 'IQueryHandler ' thì bạn cần 'AsImplementedInterfaces' vì phương thức đăng ký mặc định là' AsSelf'. – nemesv

Các vấn đề liên quan