繁体   English   中英

等效的简单 Injector.Register 调用

[英]Equivalent Simple Injector .Register invocations

我有一个 object 的构造函数需要一个原语。 我使用委托注册它(请原谅人为的例子)。

container.Register<Account>(() => new Account(1000M), Lifestyle.Singleton);

我将这种类型的Account注册为接口IAccount的实现。 当使用下面标记为B的调用这样做时,SimpleInjector 的 .Verify .Verify()会抱怨:

/* B */container.Register<IAccount, Account>(Lifestyle.Singleton);

Account类型的构造函数包含decimal类型的参数'funds',不能用于构造函数注入,因为它是一个值类型。 (参数'TImplementation')

使用标记为A的调用没有此类问题,并且可以按预期工作:

/* A */container.Register<IAccount>(() => container.GetInstance<Account>(), Lifestyle.Singleton);

我似乎错误地假设AB实际上是等效的。 我错过了什么? 为什么B没有使用注册的委托来创建Account实例? 谢谢你。

(以下文件为 LINQPad (.linq) 格式)

<Query Kind="Program">
  <NuGetReference>SimpleInjector</NuGetReference>
  <Namespace>SimpleInjector</Namespace>
</Query>

void Main()
{
    var containerRegistry = new ContainerRegistry();
    Console.WriteLine("Balance = " + containerRegistry.GetInstance<Account>().Balance);
}

public class ContainerRegistry
{
    private readonly Container container = new Container();

    public ContainerRegistry()
    {
        container.Register<Account>(() => new Account(1000M), Lifestyle.Singleton);

        /* A */container.Register<IAccount>(() => container.GetInstance<Account>(), Lifestyle.Singleton);
        /* B */container.Register<IAccount, Account>(Lifestyle.Singleton);

        container.Verify();
    }
    
    [Obsolete] public TInstanceType GetInstance<TInstanceType>() where TInstanceType : class
        => container.GetInstance<TInstanceType>();
}

public class Account : IAccount
{
    public decimal Balance => funds;
    
    private readonly decimal funds;
    
    public Account(decimal funds)
    {
        this.funds = funds;
    }
}

public interface IAccount
{
    decimal Balance { get; }
}

尝试这个:

container.Register<IAccount>(() => new Account(1000M), Lifestyle.Singleton);

暂无
暂无

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

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