В момента използвам 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 приложение и не искам да ги разделям точно сега.