2013-11-15 76 views
0

让我们在C#中说我已经被称为A类依赖属性和构造函数的参数使用Unity

public class A : IInterfaceA 
{ 

[Dependency] 
B _b; 


} 

然后在B级我有这样一个构造函数:

public class B 
{ 

... 

public B(string someParam) { ... } 

... 

} 

现在,我注册类一个这样的:

_unityContainer.RegisterType<IInterfaceA, A>("RegistrationA"); 

,并解决我做的接口:

_unityContainer.Resolve<IInterfaceA>("RegistrationA", new ParameterOverride("someParam", "The param.")); 

现在我想知道是否是解决类和传递这样的参数是好的做法,或者我应该以另一种方式做。 非常感谢:)

回答

0

首先,您发布的代码不起作用:实际上,您将重写类A的参数,而在您的代码中,参数的构造函数为B

一般来说,使用参数覆盖是不是在我看来,一个好的做法(除非一些非常特异性目的情况下像一个控制台应用程序或使用现有容器的Web服务,但它在大多数情况下可避免),这些原因:

  1. 使用Resolve看起来像一个服务定位器:现今的反模式。你会发现很多关于搜索的讨论。
  2. 使用ParameterOverride意味着客户端(Resolve的调用者)完全知道映射到容器中的类型,并希望使用特定参数初始化该类型。但这与控制反转相反。

最好的方法是使用抽象工厂。您可以在代码中添加和使用更加灵活和固体抽象工厂:

public interface BFactory { 

    B Create(string bparam); 

} 

public class BFactoryUnity : BFactory { 
    private IUnityContainer container; 

    public BFactoryUnity(IUnityContainer container) { 
    this.container = container; 
    } 

    public B Create(String bParam) { 
     var b = new B(bParam); 
     container.BuildUp(b); 
     return b; 
    } 
} 

所以,你可以注册:

_unityContainer.RegisterType<IInterfaceA, A>("RegistrationA") 
      .RegisterType<BFactory, BFactoryUnity>(); 

现在,客户端可以解决只有工厂,并使用它:

var bFactory = _container.Resolve<BFactory>(); 
var b = bFactory.Create(); 

现在,在一个大的应用程序中,你将需要很多类似的工厂。为了避免抽象工厂和实现的样板代码,您可以在Web中找到自动抽象工厂扩展的一些实现。

+0

你好你好,谢谢你的回答! 我可以使用Unity自动工厂来实现您所写的内容吗? 我的意思是这样的: '容器。RegisterType ( 新InjectionFactory(C => 新函数功能(bParam =>新B(bparam))) );' 然后 '类BFactory { 私人Func键工厂; public BFactory(Func factory) { this.factory = factory; } public B Create(string bParam) { return factory(bParam); }' 然后注册工厂并注入autofactory。 我不确定它是否可以编译,因为我现在无法测试它,但这就是我的想法。非常感谢 ! –

+0

是的,这是一个选项。 – onof

相关问题