2014-12-15 11 views
5

Điều tôi có là một giai đoạn, một số giao diện và phần đăng ký. Vấn đề là tôi cần phải xác định một số tham số như cố định và các tham số khác dưới dạng biến.Chỉ định giá trị cố định của lớp xây dựng và các biến khác từ vùng chứa

interface IDoSomething { 
void DoWork(); 
} 

interface IDoMath(){ 
void DoWork(); 
} 

interface IBehaviorBusiness{ 
void Do(); 
} 

class BehaviorBusiness { 
... 
public BehaviorBusiness(IDoSomething doSomething, IDoMatch doMatch, string connection){}; 
... 
} 

Có thể với windsor container để xác định một kết nối tham số trong khai báo, và mất IDosomethingIDoMatch từ container?

container.Register(
    Component.For<IDoSomething>() 
    ... 
} 

container.Register(
    Component.For<IDoMatch>() 
    ... 
); 

Đó là vấn đề cụ thể.

container.Register(
    Component.For<IBehaviorBusiness>() 
    .ImplementedBy<BehaviorBusiness>() 
    .DependsOn(Dependency.OnComponent<IDoSomething, [default]>(), 
       Dependency.OnComponent<IDoMatch, [default]>(), 
       Dependency.OnValue("connection", connectionString)) 
    .LifeStyle.Transient 
    ); 

Cú pháp chính xác nếu nó tồn tại?

+0

@PatrickQuirk câu trả lời là đúng nhưng tôi nghĩ rằng một cách tiếp cận tốt hơn là làm cho nhà cung cấp IConnectionString hoặc trực tiếp IConnectionProvider và phục vụ nó trong ctor chứ không phải là một tham số trực tiếp. Bằng cách này, lớp học cụ thể sẽ không có trách nhiệm tạo/quản lý/vứt bỏ kết nối mỗi lần. Điều gì về việc cung cấp các kết nối từ một thành phần khác và sau đó bơi nó thay vì sau đó xử lý nó? Bằng cách này, bạn sẽ giữ SRP không chỉ vì mục đích giữ nguyên một số nguyên tắc mà còn cho việc duy trì mã của bạn. Bạn có thể cho ví dụ về cách sử dụng chuỗi kết nối của mình không? –

+0

cũng dự án rất nhỏ và đơn giản. bạn đúng rồi. cuối cùng tôi đã thay đổi kết nối cho giao diện giả cho truy vấn, cập nhật giao diện công cộng IDbContext { DataSet GetDataSet (chuỗi strmSql); DataTable GetDataTable (chuỗi strmSql); int ExecuteSql (chuỗi strmSql); } một số thực sự đơn giản –

+0

@OgnyanDimitrov nơi tôi có thể đọc về thực tiễn tốt nhất để thực hiện IConnectionString o IConnectionProvider? tuần tiếp theo đang làm việc trong một số thực sự nghiêm trọng và có thể đọc một chút về chủ đề nó sẽ là thích hợp. Iam xem xét sử dụng EF hoặc NHibernate –

Trả lời

1

Nếu chuỗi kết nối đến từ cài đặt ứng dụng của bạn, sau đó sử dụng Dependency.OnAppSettingsValue():

container.Register(
    Component.For<IBehaviorBusiness>() 
    .ImplementedBy<BehaviorBusiness>() 
    .DependsOn(Dependency.OnAppSettingsValue("connection", "connectionString")) 
    .LifeStyle.Transient 
); 

Ở đây, "kết nối" là tên của tham số trong lớp constructor, và 'connectionString' là chìa khóa của giá trị chuỗi kết nối trong cài đặt ứng dụng của bạn (ví dụ: Web.Config). Bạn không cần phải xác định các giá trị khác, Windsor sẽ giải quyết chúng như thường lệ.

+0

cảm ơn rất nhiều, bro –

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