2

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

IE,

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

这基本上是我想做的。有时我需要创建一个新类,有时我已经有了可用的类。请问我该如何实现?

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

先感谢您。


工厂模式将使解决方案变得优雅,然而,这给我的应用程序增加了一堆复杂性,而所需要的只是一个非常简单的解决方案,它也可以正常工作。

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

4

2 回答 2

7

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

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

但是,如果您Person在应用程序的各个点创建实例,那么您不想引用容器,因此您应该使用PersonFactory通过容器解析的代替。看看Typed Factory Facility

于 2012-06-27T11:47:07.030 回答
1

这是我如何将参数传递给构造函数的示例(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();
 }

根据“有时我需要创建一个新课程,有时我已经有了可用的课程。请问我该如何实现?” - 尝试实现工厂模式

于 2012-06-27T11:49:03.997 回答