2009-09-27 17 views
6

Bất cứ ai có thể giúp đỡ?Unity (phụ thuộc tiêm): Làm thế nào để vượt qua trong một tham số để các nhà xây dựng trong RegisterType

Tôi có một ứng dụng WPF (không nên quan trọng) và trong onStart tôi có thứ bootstrap của tôi .. của nó như thế này ..

 // Create unity container my service and repository 
     container = new UnityContainer() 
      .RegisterType<ISecurityRepository, SecurityRepository>() 
      .RegisterType<ISecurityService, SecurityService>(); 

Về cơ bản ISecurityService hy vọng tôi để vượt qua trong một ISecurityRepository, vì thế mà ở trên thất bại.

Nhưng tôi hơi bối rối, tôi có phải tạo ra một IsecurityRespository mới và sau đó vượt qua nó trong, điều này đánh bại đối tượng phải không?

Có cách nào tôi nói "chuyển vào SecurityService ISecurityRepository từ vùng chứa" nhưng chưa được tạo chưa?

Bất kỳ ý tưởng nào?

+0

Bạn có thể đăng định nghĩa hàm tạo của lớp dịch vụ không? –

+0

Xin chào, tôi đã thêm thông tin –

Trả lời

4

Bạn không phải tạo phiên bản trước. Tất cả chỉ hoạt động. Đó là sự kỳ diệu của IoC Containers.

Ví dụ:

public interface ISecurityService { } 
public interface ISecurityRepository { } 

public class SecurityService : ISecurityService 
{ 
    public SecurityService(ISecurityRepository repository) 
    { 
     Console.WriteLine("SecurityService created"); 
     Console.WriteLine("Repository is " + repository); 
    } 

    public override string ToString() 
    { 
     return "A SecurityService"; 
    } 
} 

public class SecurityRepository : ISecurityRepository 
{ 
    public SecurityRepository() 
    { 
     Console.WriteLine("SecurityRepository created"); 
    } 

    public override string ToString() 
    { 
     return "A SecurityRepository"; 
    } 
} 

public class MyClassThatNeedsSecurity 
{ 
    public MyClassThatNeedsSecurity(ISecurityService security) 
    { 
     Console.WriteLine("My class has security: " + security); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     using (IUnityContainer container = new UnityContainer()) 
     { 
      container.RegisterType<ISecurityRepository, SecurityRepository>() 
        .RegisterType<ISecurityService, SecurityService>(); 

      MyClassThatNeedsSecurity myClass = 
       container.Resolve<MyClassThatNeedsSecurity>(); 
     } 
    } 
} 

này sẽ in:

SecurityRepository created 
SecurityService created 
Repository is A SecurityRepository 
My class has security: A SecurityService

Bạn có một số tùy chọn, chẳng hạn như trước tạo trường hợp của bạn (như bạn thấy trong bài viết tiếp theo của bạn) hoặc kéo dài tuổi thọ của các phụ thuộc được tiêm để chúng không được tái tạo mỗi khi chúng cần thiết. Nhưng đối với trường hợp cơ sở, điều này sẽ làm việc.

+1

Thans TrueWill! Điều đó làm việc, Vì vậy, xem nếu tôi hiểu điều này một cách chính xác, Sử dụng registerTypes sẽ tạo ra một trường hợp mới mỗi khi tôi giải quyết? và sử dụng cách của tôi trong followup của tôi sử dụng cùng một ví dụ mỗi khi tôi sử dụng giải quyết? Vì vậy, tôi cho rằng nếu cần phải giữ một đối tượng sống tốt hơn để sử dụng RegisterInstance chứ không phải registerType? –

+1

@mark: Có, với tùy chọn RegisterType mặc định, một cá thể mới sẽ được tạo mỗi khi bạn gọi Resolve ** và ** loại được giải quyết cần phụ thuộc (trực tiếp hoặc gián tiếp). Sử dụng RegisterInstance sẽ cung cấp cùng một thể hiện mỗi lần. Bạn cũng có thể sử dụng các overload để Unity tạo instance một lần và chỉ một lần cho mỗi container (như Singleton); từ sự giúp đỡ của Unity: "myContainer.RegisterType (mới ContainerControlledLifetimeManager());" – TrueWill

+0

Cảm ơn! .. tuyệt vời giúp đỡ .. –

1

đây là một số thông tin khác. Các constructor của lớp học của tôi là

public SecurityService(ISecurityRepository repository) 
     : base(repository) 
    { 

    } 

Sau khi chơi xung quanh một chút, tôi cố gắng làm như sau nhưng điều này gây ra tôi để tạo ra các trường hợp FIRST ... Có vẻ như để làm việc .., nhưng một sự thay thế của nó.

 // Create unity container my service and repository 
     ISecurityRepository securityRepository = new SecurityRepository(); 
     ISecurityService securityService = new SecurityService(securityRepository); 

     container = new UnityContainer(); 
     container.RegisterInstance<ISecurityRepository>(securityRepository); 
     container.RegisterInstance<ISecurityService>(securityService); 
+0

, chúng tôi nên làm gì nếu có nhiều nhà xây dựng của lớp dịch vụ? Vui lòng xem vấn đề bên dưới: - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan

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