-
Notifications
You must be signed in to change notification settings - Fork 39
Description
IResolveContext interface
During resolution, the IResolveContext interface provides a way for the build pipeline to resolve dependencies.
Usage
It is used in every resolver pipeline as this:
public delegate object? ResolveDelegate<TContext>(ref TContext context)
where TContext : IResolveContext;
{
// Resolution code ...
}It is defined as follows:
public interface IResolveContext : IPolicyList
{
IUnityContainer Container { get; }
Type Type { get; }
string? Name { get; }
object? Resolve(Type type, string? name);
}The interface exposes a type and the name of the currently resolved instance and provides a method to get other dependencies by calling Resolve(otherType, otherName). The method automatically checks if any dependency overrides are provided an returns matching overrides as necessary.
Problem
The interface declaration presents two problems:
- It is derived from
IPolicyList - It exposes
IUnityContainer
IPolicyList interface
IPolicyList interface allows setting and retrieving container internal policies and makes it vulnerable. In other words, a simple resolver could redefine the container's behavior without any limit.
IUnityContainer member
The container's instance exposed to the resolver allows bypassing of resolution pipeline code and creates situations with a nondeterministic state.
Solution
The new interface should remove both: IPolicyList and IUnityContainer interfaces and will be defined as follows:
public interface IResolveContext
{
Type Type { get; }
string? Name { get; }
object? Resolve(Type type, string? name);
}