Tôi có loại phụ thuộc vòng tròn đơn giản nhất trong structuremap - lớp A dựa vào lớp B trong hàm tạo của nó và lớp B dựa vào lớp A trong hàm tạo của nó. Để phá vỡ sự phụ thuộc, tôi đã tạo lớp B làm lớp A là một thuộc tính, chứ không phải là một đối số hàm tạo, nhưng structuremap vẫn than phiền.Các phụ thuộc thông tư trong StructureMap - chúng có thể bị phá vỡ với việc phun thuộc tính không?
Tôi đã thấy các phụ thuộc vòng tròn bị hỏng bằng phương pháp này trong các khung công tác DI khác - đây có phải là vấn đề với Structuremap hoặc tôi đang làm điều gì sai?
Edit: tôi nên đề cập đến tài sản đó lớp B là một mảng các trường lớp A, dây lên như thế này:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Chỉ cần làm rõ, tôi muốn các chuỗi sự kiện sau xảy ra:
- Xây dựng một thể hiện của b, "b"
- Xây dựng một thể hiện của A, "a", tiêm "b" vào constructor của nó
- Set "b.ArrayOfA" tới [ "a"]
Và tôi muốn tất cả điều này xảy ra sử dụng autowiring, nếu có thể ...
Sửa 2: Dưới đây là một ví dụ đơn giản mà sử dụng dây rõ ràng lên:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
Members những nguyên nhân cấu hình "hai chiều phụ thuộc vấn đề phát hiện với RequestedType: IocTest2.ILoader ..."
Xin chào Joshua - Tôi vừa cho nó đi và nhận được một "Vấn đề phụ thuộc hai chiều" - Tôi nghĩ đây là dấu hiệu của sự phụ thuộc vòng tròn trong StructureMap? Việc xây dựng và thiết lập một đối tượng bằng StructureMap có hiệu quả nguyên tử hay không, vì vậy các tham chiếu vòng tròn không thể được giải quyết? Có vẻ như không, nhưng tôi đã không thể làm cho nó hoạt động cho đến nay ... – Andy
Sự phụ thuộc hai chiều Vấn đề chỉ ra một tham chiếu vòng tròn. Tuy nhiên, mẫu mã mà tôi cung cấp S W làm việc, như thể hiện của B được tạo trước khi lambda OnCreation được gọi. Sau đó bạn có thể chuyển thể hiện B đó vào hàm tạo của A, và sau đó thiết lập thuộc tính B thành A. Tôi đã thử nghiệm mã ở trên và nó hoạt động. Nếu bạn vẫn nhận được các vấn đề tham chiếu vòng tròn, phải có các phụ thuộc khác mà bạn chưa đề cập đến. –
Tôi nên làm rõ rằng khi sử dụng ví dụ mã của tôi, bạn KHÔNG nên đặt bất kỳ chính sách nào để có StructureMap thực hiện phép đặt setter trên B. Bạn đang tự thực hiện việc tiêm setter trong lambda OnCreation. –