Unity DI:从每个请求解析为全局单例到每个请求

时间:2017-09-11 09:32:11

标签: c# asp.net asp.net-web-api dependency-injection unity-container

我有一个控制器调用一个全局单例,在ASP.NET WebAPI的上下文中调用每个请求实例。基本上

per-request => singleton =>每个请求的

以下设置是否正确?我特别担心第二个请求实例,因为它可能是基于用户的声明。

或者这是一个反模式,单例应该从控制器接收(每个请求)依赖项吗?

    // UnityConfig.cs, the Resolver uses CreateChildContainer()
    public static void RegisterTypes(IUnityContainer unity)
    {
        // global singleton
        unity.RegisterType<MessageContext>(new ContainerControlledLifetimeManager());
        // instance per request
        unity.RegisterType<ClaimsContext>(new HierarchicalLifetimeManager());
    }

    // API controller
    public class MyController : ApiController
    {
        private readonly MessageContext _message;

        public FormController(MessageContext message)
        {
            _message = message;
        }

        public Task<IHttpActionResult> MyAction()
        {
            _message.FireAndForget();
            return Ok();
        }
    }

    // global singleton to keep connection pool
    public class MessageContext
    {
        private readonly IUnityContainer _unity;

        public MessageContext(IUnityContainer unity)
        {
            _unity = unity;
        }

        public Task FireAndForget()
        {
            // resolve per request
            var claim = _unity.Resolve<ClaimsContext>().MyClaim);
            // ...
        }
    }

1 个答案:

答案 0 :(得分:0)

正如评论中所指出的,上面的示例代码需要重新构建。为了解决这个问题,我将MessageContext分成了一个长寿命和短命的部分。短命的部分接收短命的ClaimsContext,而长寿的部分只保留长寿的部分。