2013-05-08 34 views
6

Tôi đang làm lại một codebase hiện có để sử dụng tốt hơn hộp chứa autofac. Tình huống mà tôi đang gặp phải là rất nhiều thứ được sử dụng để giải quyết các thành phần của họ trực tiếp từ vật chứa trong mẫu chống cổ điển ServiceLocator. Tôi đang trong quá trình giới thiệu các sơ đồ đơn vị làm việc phù hợp sử dụng LifetimeScope.Kiểm tra xem thành phần có được giải quyết ở ngoài cùng bên ngoài LifetimeScope

Vấn đề tôi đang gặp phải là một số thành phần phải được giải quyết từ một đứa trẻ LifetimeScope khi chúng đang triển khai IDisposable và phải được xử lý. Nếu chúng được giải quyết trong phạm vi gốc sẽ không bao giờ xảy ra.

Có cách nào để ngăn không cho một số thành phần được giải quyết trong phạm vi gốc không? Crashing thời gian chạy là OK cho điều này, kể từ khi tôi đang đi qua các trường hợp này từng người một và giới thiệu phạm vi khi cần thiết. Cách duy nhất tôi có thể nghĩ đến để làm điều này là tạo ra một thành phần giả nhỏ được giải quyết một lần cho phạm vi toàn thời gian gốc và giải quyết trong .InstancePerLifetimeScope(), lưu trữ tĩnh ở đâu đó. Sau đó, khi một thành phần sau đó được giải quyết, tôi sẽ nhận được một trong những thành phần giả và xem nếu nó là cùng một ví dụ như là một trong đó tồn tại trong phạm vi gốc. Đó là một chút clunky mặc dù, và là có một cách tốt hơn?

Trả lời

1

Bạn có thể thử sử dụng 'mỗi phù hợp với phạm vi đời' đăng ký:

containerBuilder.RegisterType<Foo>() 
       .As<IFoo>() 
       .InstancePerMatchingLifetimeScope("scope"); 

Bằng cách này IFoo chỉ có thể được giải quyết khi có ít nhất một trong phạm vi tổ tiên đời là một phạm vi đời được gắn thẻ và thẻ của nó tương đương với "scope". Phạm vi tuổi thọ gốc thường không được gắn thẻ, vì vậy khi bạn cố gắng giải quyết IFoo từ nó, Autofac sẽ ném một ngoại lệ.

Xem the Autofac wiki để biết thêm thông tin.

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