1

I have a set of interfaces I need to implement, and in each implementation I need to access a value that is available in the calling context, but is not a part of the interface method. Also, the calling context receives the instance as a dependency.

To solve this, I'm looking to see if there is some way to create a scoped context of sorts, similar to HttpContext, with a limited lifespan.

This is how I envision it: The OrderProcessor class makes the userId value available to all method calls within the using scope for the instance of the UserContext class.

The question is: Is this even possible, and if so how?

public class OrderProcessor
{
    private readonly IBusiness _business;

    public OrderProcessor(IBusiness business)
    {
        _business = business; // DI is providing us with an instance of MrBusiness
    }

    public static void ProcessOrders(string userId)
    {
        using (new UserContext(userId))
        {
            var thisUsersOrders = _business.GetOrders();
        }
    }
}

public interface IBusiness
{
    List<Order> GetOrders();
}

public class MrBusiness : IBusiness
{
    public List<Order> GetOrders()
    {
        var userId = UserContextManager.Current.UserId;

        // Use the userId to retrieve data from somewhere
    }
}

public class UserContextManager
{
    public static UserContext Current
    {
        get
        {
            // If this had been a web application I could perhaps have used the Http context, hmm?
        }
    }
}

public class UserContext : IDisposable
{
    public string UserId { get; }

    public UserContext(string userId)
    {
        UserId = userId;
    }

    public void Dispose()
    {
    }
}
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Sigurd Garshol
  • 1,376
  • 3
  • 15
  • 36

0 Answers0