có lẽ đây là dễ dàng, nhưng tìm kiếm nó trên mạng Internet đã cho tôi đau đầuLâu đài Windsor - Làm thế nào để lập bản đồ dụ đặt tên trong constructor injection
đây là vấn đề:
interface IValidator
{
void Validate(object obj);
}
public class ValidatorA : IValidator
{
public void Validate(object obj) { }
}
public class ValidatorB : IValidator
{
public void Validate(object obj) { }
}
interface IClassA { }
interface IClassB { }
public class MyBaseClass
{
protected IValidator validator;
public void Validate()
{
validator.Validate(this);
}
}
public class ClassA : MyBaseClass, IClassA
{
//problem: validator should ValidatorA
public ClassA(IValidator validator) { }
}
public class ClassB : MyBaseClass, IClassB
{
//problem: validator should ValidatorB
public ClassB(IValidator validator) { }
}
public class OtherClass
{
public OtherClass(IClassA a, IClassB b) { }
}
//on Main
var oc = container.Resolve<OtherClass>();
Bất kỳ ý tưởng?
EDIT
Tôi đã đăng ký ValidatorA
và ValidatorB
với Named
, bây giờ vấn đề như thế nào Lâu đài Windsor có thể tiêm những validator đúng với ClassA
và ClassB
, là có một cách để làm điều đó? hoặc có giải pháp nào tốt hơn không?
nếu có ai đó nghĩ rằng thiết kế lớp của tôi sai, vui lòng mở bất kỳ lời khuyên nào. Cho đến nay tôi nghĩ rằng nó chính xác. Có, trình xác thực có cấu hình cụ thể cho Lớp cụ thể. nhưng có những lý do được tóm tắt:
- Trình xác nhận là một đối tượng phức tạp, đôi khi phải kết nối với cơ sở dữ liệu, vì vậy tôi phải chuyển giao diện thay vì triển khai cho nhà xây dựng vì lý do kiểm tra đơn vị.
- Không có cách nào để sử dụng giao diện khác nhau cho bất kỳ Validator, bởi vì phương pháp duy nhất mà tôi sử dụng là
Validate
- Tôi nghĩ
MyBaseClass.Validate()
một chung mẫu phương pháp mẫu phải không?
Mô tả sự cố của bạn là trừu tượng. –
Nếu ClassA yêu cầu triển khai cụ thể IValidator, thì thiết kế sai, vì giao diện không cung cấp sự trừu tượng hữu ích. –
@ Jacek Grogon, không có tôi chỉ cần phương thức 'Validate', thực sự có một baseclass ClassA và ClassB được gọi là phương thức' Validate'. nhưng tôi không viết nó ở đây chỉ để che giấu sự phức tạp. – ktutnik