在运行时注入值
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
。
我的存储库 类 需要从 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
。