城堡温莎传递参数

时间:2012-06-27 11:38:38

标签: c# castle-windsor

我有一个DI容器,我想通过DI容器将参数传递给构造函数。

public interface IPerson { }

public class Person : IPerson {
    private int _personId;

    Person() { _personId = 0; }
    Person(int id) { _personId = id; }
}
...
Container.Register(Component.For<IPerson>().ImplementedBy<Person>().Lifestyle.Transient);
...
//Person is already available
Container.Resolve<Person>(55);

//Person is not available
Container.Resolve<Person>();

这基本上就是我想要做的。有时我需要创建一个新类,有时我已经有了可用的类。我怎么能实现这个目标呢?

我原以为我可以使用动态参数,但我不确定如何。

提前谢谢。


工厂模式会使解决方案变得优雅,但是,这会给我的应用程序增加一些复杂性,当需要的只是一个非常简单的解决方案时,它也会起作用。

在我自己中传入一个整数比编写整个工厂来完成同样的工作容易得多。

2 个答案:

答案 0 :(得分:7)

您可以将匿名类型传递给Resolve方法,该方法指定要使用的参数值:

container.Resolve<IPerson>(new { id = 5 });

但是,如果您在应用程序的不同位置创建Person的实例,那么您不希望引用该容器,因此您应该使用PersonFactory而不是通过容器解析。看看Typed Factory Facility

答案 1 :(得分:1)

这是我的例子,如何将params传递给构造函数(DI接触器是统一的):

 static void Main(string[] args)
 {
     IUnityContainer container = new UnityContainer();

     container.RegisterType<ILogger, FileLogger>(new InjectionConstructor(new[] { "c:\\myLog.txt" }));
     ILogger logger = container.Resolve<FileLogger>();
     logger.Write("My message");
     Console.ReadLine();
 }

根据“有时我需要创建一个新课程,有时我已经有了课程。我怎么能实现这个目标?” - 尝试实施Factory模式