6

Tôi đã viết một lớp có một số phụ thuộc mà nó giải quyết từ vùng chứa thống nhất.Ví dụ đăng ký Unity và giải quyết

Từ lớp học chính của tôi, tôi tạo ra một đối tượng mới

MyObject myObject = new MyObject(); 

tôi đăng ký với Unity container của tôi

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager()); 

tôi tạo ra các loại cần này như một sự phụ thuộc

ConsumerObject consumer = new ConsumerObject(); 

người tiêu dùng trông giống như sau:

public class ConsumerObject 
{ 
    public ConsumberObject() 
    { 
     theObject = (MyObject)UContainer.Resolve(typeof(MyObject));  
    } 
} 

này ném một ngoại lệ:

Nghị quyết của sự phụ thuộc thất bại, type = "MyObject", name = "". Thông báo ngoại lệ là: Hoạt động xây dựng hiện tại (khoá xây dựng khóa [MyObject, null]) không thành công: Tham số pp không thể được giải quyết khi cố gắng gọi hàm tạo MyObject (IPreferenceStorageProvider pp). (Loại chiến lược BuildPlanStrategy, chỉ số 3)

Tại sao cuộc gọi giải quyết của tôi lại cố gắng gọi một contrructor khác trên loại? Tôi đã tạo ra nó và đăng ký các trường hợp .. Tôi cũng đã thử nó như: theObject = UContainer.Resolve<MyObject>(); dường như không thực hiện bất kỳ sự khác biệt ..

Cảm ơn

Trả lời

1

Theo như tôi biết Unity cố (theo mặc định) để gọi hàm tạo với số lượng tham số lớn nhất và cố gắng giải quyết từng tham số từ ánh xạ. Bạn đã thêm bản đồ cho IPreferenceStorageProvider hoặc loại bỏ hàm tạo yêu cầu tham số này.

Nếu bạn không muốn tham số IPreferenceStorageProvider bằng cách tiêm bởi sự thống nhất có lẽ nó không nên được khai báo như là một tham số hàm tạo. Bạn có thể khởi tạo mã lệnh cứng của đối tượng này trong hàm tạo mặc định.

+2

vấn đề là "MyObject" không phải đối tượng của tôi .. Nó có khoảng 15 nhà xây dựng .. Tôi có thể tạo ra nó, nhưng tôi không có quyền kiểm soát cấu trúc của nó .. Tại sao Unity có cố gắng làm mới nó không? Tôi tạo ra một thể hiện và đăng ký nó .. Nó bây giờ trong container như một singleton, Nó không nên gọi bất kỳ nhà xây dựng .. ??? –

3

Tôi không chắc chắn lý do bạn thấy hành vi của mình. Tôi vừa tạo một thử nghiệm sao chép kịch bản của bạn và nó hoạt động tốt.

Các bạn đã thử một cái gì đó như thế này,

public class ConsumerObject 
{ 
    public ConsumberObject(MyObject myObject) 
    { 
     theObject = myObject 
    } 
} 

và sau đó sử dụng UContainer.Resolve<MyObject>()?

Điều duy nhất mà tôi có thể nghĩ đến là khi bạn truy cập UContainer.RegisterInstance và sau đó là UContainer.Resolve bạn đang thực sự truy cập hai vùng chứa khác nhau. Bạn có thể chỉ cho chúng tôi cách bạn khai báo UContainer không?

6

Tôi nghĩ rằng vấn đề là bạn sử dụng ExternallyControlledLifetimeManager. Trong trường hợp này, thùng chứa Unity chỉ giữ tham chiếu yếu đến cá thể của bạn. Và khi bạn cố gắng giải quyết, ví dụ của bạn đã được thu gom rác. Đó là lý do tại sao LifeTimeManager mặc định cho .RegisterInstance() là ContainerControlledLifeTimeManager. Và trường hợp của Darrel Miller nó hoạt động, bởi vì nó không phải GC-ed. Hãy thử đăng ký dụ bạn theo cách này:

UContainer.RegisterInstance<MyObject>(myObject); 
Các vấn đề liên quan