簡體   English   中英

Unity DI:從每個請求到全局單例再到每個請求

[英]Unity DI: Resolving from per-request to global singleton to per-request

我有一個控制器在ASP.NET WebAPI的上下文中調用全局單例,該全局單例調用每個請求實例。 基本上

每個請求=>單例=>每個請求

以下設置是否正確? 我特別擔心第二個每個請求實例,因為它可能是基於用戶的聲明。

還是說反模式和單例應該從控制器接收(按請求)依賴關系?

    // 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);
            // ...
        }
    }

正如評論中指出的那樣,上述示例代碼需要進行重組。 為了解決此問題,我將MessageContext分為了長期和短期兩個部分。 短命的部分接收短命的ClaimsContext ,而長命的部分僅保留長命的連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM