2016-02-15 48 views
8

Tôi đang phát xung quanh với ASP.NET Core mới và hiện đang tạo API mà tôi muốn gọi từ giao diện người dùng JavaScript.MediatR với ASP.NET Core DI

Tôi muốn sử dụng mẫu hòa giải để giảm khớp nối và tôi đã tìm thấy Thư viện MediatR từ Jimmy Bogard.

Vấn đề của tôi bao gồm việc kết nối nó bằng cách sử dụng bản dựng DI, tôi đã thử xem examples, nhưng không thể thấy cách nó liên kết với phương thức ConfigureServices trong lớp khởi động.

Có ai có thông tin chi tiết nào không?

UPDATE: Tôi đã nhận nó làm việc, từ phương pháp ConfigureService tôi:

services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t)); 

services.Scan(scan => scan 
     .FromAssembliesOf(typeof(IMediator), typeof(MyHandler.Handler)) 
     .AddClasses() 
     .AsImplementedInterfaces()); 
+1

https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.AspNetCore/Program.cs vẻ khá đơn giản với tôi, nhưng đối với việc quét lắp ráp, bạn cần gói Scrutor này (ASP.NET Core's DI không đi kèm với chức năng quét lắp ráp và không có kế hoạch gửi nó) – Tseng

+0

Bạn sẽ thêm nó vào phương thức ConfigureService như thế nào? 'services.AddTransient (typeof (IMediator), BuildMediator(). GetType());' – Nyegaard

+1

Bạn không muốn đăng ký theo cách đó, Transient nghĩa là nó sẽ được tạo mỗi khi phụ thuộc được giải quyết. 'services.AddScoped (p => t => p.GetRequiredService (t));' và 'services.AddScoped (p => t => p.GetRequiredServices (t));' là các phương thức của nhà máy được tiêm vào trung gian và giải quyết các thông báo (đa) hoặc yêu cầu (đơn) – Tseng

Trả lời

16

Tính đến tháng 7 năm 2016, Jimmy Bogard, tác giả của MediatR, đã phát hành gói đăng ký MediatR và Người xử lý, với dịch vụ ASP.Net Core DI (thực tế là giao diện IServiceCollection, được thực hiện trong Microsoft.Extensions.DependencyInjection và không bị hạn chế chỉ sử dụng trong ASP.Net Core).

MediatR.Extensions.Microsoft.DependencyInjection

Link to GitHub Project.

Link to NuGet Package information.

Một bài viết trên blog giới thiệu gói và nó khả năng có thể được tìm thấy đăng ký here

Ví dụ sao chép trực tiếp từ (rất ngắn) bài viết trên blog:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    services.AddMediatR(typeof(Startup)); 
} 

Gói này thực hiện một số chức năng cho phép MediatR, bao gồm việc quét các cụm cần thiết cho Trình xử lý:

Bạn có thể chuyển vào hội đồng nơi người xử lý của bạn hoặc bạn có thể vượt qua trong các đối tượng Type từ các assembly nơi các trình xử lý đó cư trú. Phần mở rộng sẽ thêm giao diện IMediator vào các dịch vụ của bạn, tất cả các trình xử lý và các nhà máy ủy nhiệm chính xác để tải các trình xử lý. Sau đó, trong điều khiển của bạn, bạn chỉ có thể sử dụng một sự phụ thuộc IMediator:

public class HomeController : Controller 
{ 
    private readonly IMediator _mediator; 

    public HomeController(IMediator mediator) 
    { 
    _mediator = mediator; 
    } 
    public IActionResult Index() 
    { 
    var pong = _mediator.Send(new Ping {Value = "Ping"}); 
    return View(pong); 
    } 
} 
+2

Đây phải là câu trả lời đúng. Nó không chỉ đơn giản hơn thanh lịch và đơn giản, mà nó còn được đề xuất bởi người tạo ra Mediatr. – reydelleon

+1

Vâng, chính sách của StackOverflows là 'câu trả lời chính xác' là câu trả lời chính xác được người hỏi đặt câu hỏi giải quyết vấn đề cụ thể của họ - theo ý kiến ​​của họ. Đó là bằng cách upvoting rằng câu trả lời sau, hoặc câu trả lời hữu ích rộng rãi hơn, được thu hút sự chú ý của người dân. Tuy nhiên, tôi muốn mọi người sẽ ngừng trả lời các câu hỏi của chính họ trong vòng một giờ, và thực sự cho mọi người cơ hội để trả lời. Có nhiều câu trả lời không chính xác, nghèo nàn, hoặc lỗi thời với những ve xanh bên cạnh chúng; Tôi khuyên mọi người nên đọc tất cả các câu trả lời và xác định câu trả lời nào phù hợp với họ, và chú ý đến những ngày đăng tải. – dmcquiggin

+0

Thật không may là thư viện chỉ hoạt động nếu Trình xử lý là các lớp công khai. Nếu ví dụ được định nghĩa với phạm vi hiển thị nội bộ, nó không hoạt động – Lorenzo

2

tôi nhận nó làm việc, mã của tôi:

public void ConfigureServices(IServiceCollection services) 
{ 
     services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t)); 
     services.AddScoped<MultiInstanceFactory>(p => t => p.GetRequiredServices(t)); 
     services.Scan(scan => scan 
       .FromAssembliesOf(typeof(IMediator), typeof(MyHandlerOne.Handler)) 
       .FromAssembliesOf(typeof(IMediator), typeof(MyHandlerTwo.Handler)) 
      .AddClasses() 
      .AsImplementedInterfaces()); 
} 

và tôi có một lớp mà thực hiện các GetRequiredService rằng MultiInstanceFactory cần :

public static class GetServices 
{ 
    public static IEnumerable<object> GetRequiredServices(this IServiceProvider provider, Type serviceType) 
    { 
     return (IEnumerable<object>)provider.GetRequiredService(typeof(IEnumerable<>).MakeGenericType(serviceType)); 
    } 
} 
0

Tôi đã tạo một DI helper for ASP.NET Core RC2 mà yo u có thể thêm vào khởi động của bạn. Nó cung cấp cho bạn bản đồ dựa trên quy ước cơ bản để nếu bạn có một lớp học như:

MyClass : IMyClass 

Nó sẽ ánh xạ IMyClass trong thùng chứa IOC.

Tôi cũng đã thêm Bản đồ cho MediatR.

Để sử dụng nó Chỉ cần thêm các lớp học để dự án của bạn và sau đó trong lớp startup.cs bạn thêm những dòng bạn cần đến ConfigureServices() phương pháp:

public void ConfigureServices(IServiceCollection services) 
{ 
    //Other Code here...... 

    var ioc = new PearIoc(services); 

    //ioc.AddTransient<IEmailSender, AuthMessageSender>(); 
    //ioc.AddTransient<ISmsSender, AuthMessageSender>(); 

    ioc.WithStandardConvention(); 
    ioc.WithMediatR(); 
    ioc.RunConfigurations(); 
} 

tôi đã thêm các phương pháp AddTransient() chỉ cho thuận tiện (bạn cũng có thể chỉ sử dụng services.AddTransient()) nhưng nó cũng cho thấy IServiceCollection trong trường hợp bạn cần làm nhiều hơn với nó.

Bạn cũng có thể mở rộng nó như tôi đã làm với phần mở rộng .WithMediatR() và viết ánh xạ tùy chỉnh của riêng bạn.

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