2009-09-27 218 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

相关问题