Използвате един Dependency Resolver за SignalR и стандартни MVC контролери?

В момента използвам Unity 3.x като моя IoC. Също така използвам библиотеката Unity.MVC4, за да управлявам живота на моя резолвер. Ето как изглежда моят резолвер:

namespace Wfm.Core.Common.Mvc.Unity
{
    public class WfmDependencyResolver : UnityDependencyResolver
    {
        public WfmDependencyResolver(IUnityContainer container) : base(container)
        {
        }


        private static WfmDependencyResolver _wfmGrabbrResolver;


        public static WfmDependencyResolver Instance { get { return _wfmGrabbrResolver ?? (_wfmGrabbrResolver = new WfmDependencyResolver(InstanceLocator.Instance.Container)); } }
    }
}

UnityDependencyResolver идва от библиотеката Unity.MVC4. В моя файл Globabl.asax.cs настройвам резолвера така:

DependencyResolver.SetResolver(WfmDependencyResolver.Instance);

Ето моят единичен клас InstanceLocator:

public class InstanceLocator
    {
        private static InstanceLocator _instance;
        public IUnityContainer Container { get; private set; }

        private InstanceLocator()
        {
            Container = new UnityContainer();

        }

        public static InstanceLocator Instance
        {
            get { return _instance ?? (_instance = new InstanceLocator()); }
        }

        public T Resolve<T>()
        {
            try
            {
                return WfmDependencyResolver.Instance.GetService<T>();
            }
            catch(Exception ex)
            {

                return default(T);
            }
        }

        public T ResolvewithoutManager<T>()
        {
            try
            {
                return Container.Resolve<T>();
            }
            catch (Exception)
            {

                throw;
            }
        }
    }

Това очевидно работи добре от моите MVC контролери, но какво би било добро решение, за да позволя на приложението ми да разрешава вътре в моите контролери Hub заедно с моите MVC контролери. В момента създадох сингълтон клас, който ми позволява да разрешавам типовете си ръчно. Мога специално да разреша моите типове вътре в моите хъбове, като използвам моя клас по този начин:

InstanceLocator.Instance.Resolve<ISomeInterface>();

Въпреки че това работи, не е идеално от гледна точка на развитието. Причината е, че искам моите типове да бъдат инжектирани, а не ръчно инстанцирани. Моите хъбове и контролери са в едно и също MVC приложение и не искам да ги разделям точно сега.


person DDiVita    schedule 07.10.2013    source източник


Отговори (1)


Има цяла статия, посветена на инжектирането на зависимости в SignalR: http://www.asp.net/signalr/overview/extensibility/dependency-injection

Така че всичко, което трябва да направите, е да напишете персонализиран резолвер на зависимости за SignalR, който очевидно ще бъде проста обвивка към вашия често споделян Unity контейнер.

person Darin Dimitrov    schedule 07.10.2013