5

Tôi cố gắng để sử dụng thống nhất để tự động tiêm một DataContext trên kho lưu trữ của tôi sử dụng một trường hợp mới mỗi lần .., ý tưởng của tôi là đảm bảo rằng mỗi lần một DataContext mới được tiêmUNITY: chuyển vào nội dung dữ liệu mới mỗi lần?

Hiện nay mình không vào việc tạo ra các kho lưu trữ, tôi nghĩ rằng nó không thể giải quyết MyDataContext

Trước khi tạo một constructor vào "kho" (xem dưới đây) để có trong DataContext trên tất cả mọi thứ đã làm việc kho của tôi nhưng bây giờ không nó ..

tôi hiện đã thiết lập này trong container hợp nhất của tôi mà tôi tạo ra trong global.asax, tôi cũng đã đăng ký loại MyDataContext là tiêu chuẩn DataContext

 container = new UnityContainer(); 

     Container.RegisterType<MyDataContext, MyDataContext>() 
      .RegisterType<IOfficeRepository, OfficeRepository>() 
      .RegisterType<IOfficeService, OfficeService>(); 

về cơ bản tôi có một dịch vụ mà các cuộc gọi kho như vậy

public class OfficeService : IOfficeService 
{ 

    IOfficeRepository repository = null; 

    public OfficeService(IOfficeRepository repository) 
    { 
     this.repository = repository; 

     if (this.repository == null) 
      throw new InvalidOperationException("Repository cannot be null"); 
    } 

đây là kho lưu trữ của tôi

public class OfficeRepository : IOfficeRepository 
{ 
    private MyDataContext db; 

    public OfficeRepository (MyDataContext dataContext) 
    { 
     this.db = dataContext; 
    } 

EDIT

Tôi gần như quên tôi đang làm điều này để tạo dịch vụ

officeService = Bootstrapper.Container.Resolve<IOfficeService>(); 

EDIT - THE ERROR được tạo

Resolution of the dependency failed, type = "MarkSmith.IOfficeService", name = "". 
Exception message is: The current build operation (build key Build 
Key[MarkSmith.OfficeService, null]) failed: The parameter repository could not be 
resolved when attempting to call constructor 
MarkSmith.OfficeService(MarkSmith.IOfficeRepository repository). (Strategy type BuildPlanStrategy, index 3) 

EDIT - REMOVING Constructor vào kho làm việc

Nó là một cái gì đó để làm với các DataContext bởi vì nếu tôi loại bỏ các constrcutor trên kho chứa một DataContext sau đó tất cả các công trình, nhưng tất nhiên tôi cần nó để chấp nhận một DataContext để có thể tiêm một datacontext "MỚI" mỗi lần

public class OfficeRepository : IOfficeRepository 
{ 
    private MyDataContext db new MyDataContext(); // CHANGE 

    //public OfficeRepository (MyDataContext dataContext) 
    //{ 
     //this.db = dataContext; 
    //} 

EDIT - THỰC TẾ LỖI

Sau khi đào sâu hơn tôi đã tìm thấy lỗi này ....

The type MyDataContext has multiple constructors of length 2. 
Unable to disambiguate. (Strategy type DynamicMethodConstructorStrategy, index 0) 
(Strategy type BuildPlanStrategy, index 3) 

EDIT - THI GIẢI QUYẾT DataContext với 1 dòng mã

Điều này cũng không thành công với cùng một lỗi như trên - nhiều nhà thầu

MyDataContext test = Bootstrapper.Container.Resolve<MyDataContext >(); 

EDIT - TẤT CẢ Constructors trên DataContext MY

Chúng được tạo ra bởi một util exernal nhưng tất cả nên cũng ..

[System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext() 
     : base(ConnectionString, mappingCache) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(string connection) 
     : base(connection, mappingCache) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(System.Data.IDbConnection connection) 
     : base(connection, mappingCache) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) 
     : base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

    [System.Diagnostics.DebuggerNonUserCode] 
    public MyDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) 
     : base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

EDIT - Để chứng minh việc tạo ra DataContext trong mã mà không Unity hoạt động 100% mà không vấn đề

MyDataContext tes2t = new MyDataContext(); 
+0

Cập nhật câu hỏi để chứng tỏ tôi đang giải quyết vụ của tôi sử dụng thống nhất –

+0

Điều gì xảy ra nếu bạn cố gắng để giải quyết một trường hợp MyDataContext sử dụng tại các điểm khác nhau? Mọi thứ dường như theo thứ tự, nhưng điều đó có thể cho chúng ta một đầu mối. – GraemeF

+0

Ngoài ra, có thiếu dòng hay lỗi đánh máy trong trích xuất mã đầu tiên không? Có vẻ như 'container' và' Container' sẽ là các trường hợp khác nhau. Bạn có thể kiểm tra xem bạn có cá thể nào bạn mong đợi bằng cách sử dụng trình gỡ lỗi hay không. – GraemeF

Trả lời

10

Tôi không chắc chắn làm việc này, nhưng có bạn đã cố gắng để đăng ký MyDataContext như một thành phần chứ không phải là ánh xạ kiểu?

container.RegisterType<MyDataContext>(); 

thay vì

container.RegisterType<MyDataContext, MyDataContext>(); 

EDIT dựa trên thông tin mới

Thủ phạm dường như là MyDataContext có nhiều hơn một nhà xây dựng. Đây là một vấn đề phổ biến với hầu hết DI Containers, bởi vì họ cần phải chọn và chỉ sử dụng một. Nếu bạn có thể loại bỏ sự mơ hồ bằng cách ràng buộc MyDataContext chỉ có một hàm tạo, thì đó có thể là giải pháp đơn giản nhất.

Nếu không, bạn sẽ có thể sử dụng một ví dụ InjectionConstructor để xác định các nhà xây dựng khi bạn đăng ký kho. Giả sử bạn muốn sử dụng một hàm tạo lấy chuỗi kết nối làm đối số:

string connectionString = 
    ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString; 
var injectedConnectionString = new InjectionConstructor(connectionString); 
container.RegisterType<MyDataContext>(injectedConnectionString); 
+0

Cảm ơn Mark, tôi đã cố gắng đó và nó giống nhau. Tôi đã cập nhật câu hỏi của mình với lỗi cụ thể .. –

+0

Cập nhật câu hỏi cũng để hiển thị loại bỏ các công trình xây dựng nhưng tất nhiên tôi cần các nhà xây dựng để chấp nhận một DataContext - bất kỳ ý tưởng? –

+0

Xem câu trả lời cập nhật của tôi. –

1

Tôi không thấy các hàm tạo MyDataContext của bạn; nhưng hãy thử thêm thuộc tính [InjectionConstructor] vào thuộc tính bạn muốn sử dụng.

+1

Điều đó sẽ hiệu quả nhưng sẽ kết hợp chặt chẽ MyDataContext với Unity. –

+0

Thông tin này không hoạt động !!! Nhưng như được chỉ ra bởi Mark của nó kết hợp chặt chẽ và cũng datacontext của tôi được tạo ra bởi một util bên ngoài để các thuộc tính sẽ được ghi đè ... Tôi thực sự không hoàn toàn hiểu tại sao đoàn kết là có một vấn đề, tôi không quan tâm đến bất kỳ nhà xây dựng (tức là constructors với 2 aprams) i am chỉ quan tâm đến constructor không tham số 0 và tất nhiên chỉ có 1 ... Có cách nào khác không ??? –

3

Với nhiều nhà xây dựng để lựa chọn, Unity không biết cái nào để sử dụng. Nó sẽ chọn một đối số với hầu hết các đối số có thể được thỏa mãn, nhưng trong trường hợp này, có hai hàm tạo với hai đối số có thể phân giải được.

Nếu bạn không muốn ghép một lớp MyDataContext thành Unity và sử dụng thuộc tính InjectionConstructor theo đề xuất của Scott (upvoted :)), bạn có thể chỉ định hàm tạo nên được sử dụng tại thời điểm đăng ký sử dụng giao diện thông thạo . Xem Configuring Constructor, Property, and Method Injection để biết chi tiết.

+0

Cảm ơn GraemeF, đây là một số thông tin tuyệt vời .. Cảm ơn tất cả sự giúp đỡ của bạn .. –

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