在运行时注入值

3
我有一些仓储类需要在运行时与普通单例类结合使用,这些仓储类需要从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());
< p > InjectionConstructor 似乎匹配了构造函数参数,因此引起了运行时错误。尽管如此,我仍然更喜欢构造函数注入,只是不确定如何实现。

1个回答

4
我有一些需要运行时值的仓储类。
您的DI容器应该建立包含可注入组件的对象图;这些组件包含了您应用程序的逻辑。不应该将运行时数据注入到组件的构造函数中,因为这会使对象图的构建和验证变得复杂。
相反,运行时数据应该通过方法调用传递给对象图。这种情况下的通用解决方案是提供一个抽象来向其使用者提供上下文相关的运行时数据。
例如,在您的情况下,一个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接