在运行时注入值

Inject value at runtime

我的存储库 类 需要从 Thread.CurrentPrincipal 中获取的运行时值(即授权声明)与常规单例 类.

相结合

给定

public class MyRepository : IMyRepository
{
    private readonly DependencyClass _dependency;
    private readonly string claim;

    protected MyRepository(DependencyClass _dependency, string claim)
    {
        //...

注册仓库时,如何注入声明?例如

unity.RegisterType<IMyRepository, MyRepository>(new HierarchicalLifetimeManager());
unity.RegisterType<DependencyClass>(new ContainerControlledLifetimeManager());

InjectionConstructor 似乎与构造函数参数匹配,因此导致运行时错误。我仍然更喜欢构造函数注入,我只是不确定该怎么做。

I have repository classes that require runtime values

您的 DI 容器应该构建包含 injectables/components 的对象图; 类 包含您的应用程序的逻辑。不应将运行时数据注入组件的构造函数,因为这会使构建、构建和验证对象图变得复杂。

相反,运行时数据应该使用方法调用通过对象图传递。这种上下文运行时数据的通用解决方案是拥有一个抽象,为它的消费者提供这种上下文数据。

例如,在您的情况下,IClaimsContext 抽象可以解决问题:

public interface IClaimsContext {
    string CurrentClaim { get; }
}

使用这个抽象,创建一个从 Thread.CurrentPrincipal 中读取声明的实现是微不足道的,正如您在此处看到的:

public sealed class ThreadClaimsContext : IClaimsContext {
    public string CurrentClaim {
        get { return Thread.CurrentPrincipal... /* get claims here */; }
    }
}

由于此实现不包含状态,因此可以毫无问题地注册为单例:

unity.RegisterInstance<IClaimsContext>(new ThreadClaimsContext());

现在您的 MyRepository 可以简单地依赖 IClaimsContext 而不是 string claims