繁体   English   中英

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

[英]Unity (dependency injection): How to pass in a parameter to the constructor in RegisterType

有人可以帮忙吗?

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

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

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

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

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

有任何想法吗?

您不必先创建实例。 一切正常。 这就是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

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

这里有更多信息。 我班的构造函数是

    public SecurityService(ISecurityRepository repository)
        : base(repository)
    {

    }

玩了一下之后,我设法做了以下但这导致我创建实例FIRST ......它似乎工作..,但它的另一种选择。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM