2011-11-02 44 views
6

Tôi đã bắt đầu sử dụng Autofac sau bài hướng dẫn này: http://flexamusements.blogspot.com/2010/09/dependency-injection-part-3-making-our.htmlAutofac khác biệt giữa ký và RegisterType

lớp đơn giản không có tham số trong constructor

builder.RegisterType<ConsoleOutputService>().As<IOutputService>(); 

Như đã giải thích trong hướng dẫn, mã ở trên có thể được đọc là: thiết lập ConsoleOutputService khi triển khai IOutputService

Lớp đơn giản với một paramete r trong constructor

builder.Register(c => new MultipleOutputService(outputFilePath)).As<IOutputService>(); 

Tôi không hiểu tại sao chúng ta sử dụng một biểu thức lambda để đăng ký lớp này (và những gì biểu hiện này chính xác không) và tại sao chúng ta không thể gõ mã này

builder.RegisterType<MultipleOutputService(outputFilePath)>().As<IOutputService>(); 

Cảm ơn trước sự giúp đỡ của bạn

Trả lời

9

Bạn không thể viết mã đó vì nó không có ý nghĩa trong C#.
RegisterType là một phương pháp chung; phương pháp chung phải có các thông số làm thông số chung.

Bạn đang cố gắng đăng ký một loại với một cách tùy chỉnh để tạo nó (trong trường hợp của bạn, một tham số hàm tạo); cách duy nhất mà C# hỗ trợ để chỉ định một điều như vậy là một biểu thức lambda (hoặc đại biểu khác).

+0

Cám ơn câu trả lời của bạn! – Swell

2

Biến thể lambda cho phép chúng ta thực hiện một số logic khi xây dựng cá thể.

+0

Cảm ơn bạn đã trả lời nhanh chóng! – Swell

2

Btw có giải pháp tốt hơn cho Autofac này đã giới thiệu tiện ích mở rộng .WithParameter() cho trình tạo đăng ký của họ.

.RegisterType<MultipleOutputService>().As<IOutputService>().WithParameter("parameterName", "parameterValue"); 

này nên phục vụ cho các sự kiện mà bạn cần phải vượt qua một cái gì đó khác hơn là một loại giao diện cho một trong những nhà thầu của bạn

+0

Điều này sẽ được đánh dấu là câu trả lời, vì nó trả lời câu hỏi thực sự. – gh9

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