Unity(依赖注入):如何将参数传递给RegisterType中的构造函数

mar*_*ith 6 c# ioc-container unity-container

有人可以帮忙吗?

我有一个wpf应用程序(应该没关系),在Onstart我有我的bootstrap东西..就像这样..

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

基本上ISecurityService希望我传入一个ISecurityRepository,因此上面的失败.

但我有点困惑,我是否必须创建一个新的IsecurityRespository然后传入它,这会失败对象不是吗?

无论如何我说"从容器传入SecurityService ISecurityRepository",但它还没有建成?

有任何想法吗?

Tru*_*ill 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>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印:

安全存储库已创建
已创建安全服务
存储库是一个安全存储库
我的班级有安全性:SecurityService

您有多种选择,例如预先创建实例(如您在后续文章中所示)或延长注入依赖项的生命周期,以便它们不会在每次需要时重新创建。但对于基本情况,这会起作用。