2009-09-27 85 views
6

任何人都可以幫忙嗎?Unity(依賴注入):如何將參數傳遞給RegisterType中的構造函數

我有一個WPF應用程序(不應該的問題)和在onStart我有我的引導的東西。它的這樣的..

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

基本上ISecurityService希望我在ISecurityRepository通過,因此以上失敗。

但我有點困惑,我是否必須創建一個新的IsecurityRespository,然後將其傳入,這樣會打敗對象不是嗎?

有無論如何我說「從容器傳入SecurityService ISecurityRepository」,但它尚未建成?

任何想法?

+0

你可以發佈你的服務類的構造函數定義嗎? – 2009-09-27 14:13:16

+0

Hi Lasse,我添加了信息 – 2009-09-27 14:22:54

回答

4

您不必首先創建實例。這一切正常。這是IoC容器的魔力。

例子:

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>(); 
     } 
    } 
} 

這將打印:

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

你有多種選擇,如創建前的情況下(如你在跟進後顯示)或延長注入依賴的生命週期,以便在每次需要時不會重新創建它們。但對於基本情況,這將起作用。

+1

Thans TrueWill!這工作,所以看看我是否正確理解這一點,使用registerTypes會創建一個新的實例,每次我解決?並在我的後續使用我的方式使用相同的實例,每次我使用解決?所以我想如果需要保持一個對象更好地使用RegisterInstance而不是registerType? – 2009-09-27 14:43:20

+1

@mark:是的,使用默認的RegisterType調用,每當您調用Resolve **和**解析類型需要依賴項(直接或間接)時,都會創建一個新實例。使用RegisterInstance將每次都提供相同的實例。你也可以使用重載讓Unity創建實例一次,每個容器只創建一次(如Singleton);從Unity幫助:「myContainer.RegisterType (新的ContainerControlledLifetimeManager());」 – TrueWill 2009-09-27 15:35:44

+0

謝謝! ..很好的幫助.. – 2009-09-27 15:50:05

1

這裏是一些更多的信息。我的類的構造函數是

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

    } 

周圍一點點打後,我好不容易做到以下幾點,但這使我第一次創建實例...這似乎工作..,但它的替代品。

 // 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

,如果有多個服務類的構造函數,我們該怎麼辦?請參閱下面的問題: - http://stackoverflow.com/questions/23443921/how-to-register-service-class-with-multiple-repository-types-in-bootstrapper-fil?noredirect=1#comment35940994_23443921 – Pawan 2014-05-05 05:52:17

相關問題