namespace SignalR02.Services { public interface ITestService { int GetRecordsCount(); } }
namespace SignalR02.Services { public class TestService : ITestService { public int GetRecordsCount() { return 10; // It's just a sample to test IOC's. } } }
[HubName("chat")] public class ChatHub : Hub { //جهت آزمایش تزریق خودکار وابستگیها private readonly ITestService _testService; public ChatHub(ITestService testService) { _testService = testService; } public void SendMessage(string message) { var msg = string.Format("{0}:{1}", Context.ConnectionId, message); Clients.All.hello(msg); Clients.All.hello(string.Format("RecordsCount: {0}", _testService.GetRecordsCount()));
برای این منظور یک کلاس جدید را به نام StructureMapDependencyResolver به برنامه اضافه کنید:
using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.SignalR; using StructureMap; namespace SignalR02.Utils { public class StructureMapDependencyResolver : DefaultDependencyResolver { private readonly IContainer _container; public StructureMapDependencyResolver(IContainer container) { if (container == null) { throw new ArgumentNullException("container"); } _container = container; } public override object GetService(Type serviceType) { return !serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass ? _container.GetInstance(serviceType) : (_container.TryGetInstance(serviceType) ?? base.GetService(serviceType)); } public override IEnumerable<object> GetServices(Type serviceType) { return _container.GetAllInstances(serviceType).Cast<object>().Concat(base.GetServices(serviceType)); } } }
برای استفاده از این کلاس تعریف شده فقط کافی است Application_Start فایل Global.asax.cs برنامه هاب را به نحو ذیل تغییر دهیم:
using System; using System.Web; using System.Web.Routing; using Microsoft.AspNet.SignalR; using SignalR02.Services; using SignalR02.Utils; using StructureMap; namespace SignalR02 { public class Global : HttpApplication { protected void Application_Start(object sender, EventArgs e) { ObjectFactory.Initialize(cfg => { cfg.For<IDependencyResolver>().Singleton().Add<StructureMapDependencyResolver>(); // the rest ... cfg.For<ITestService>().Use<TestService>(); }); GlobalHost.DependencyResolver = ObjectFactory.GetInstance<IDependencyResolver>(); // Register the default hubs route: ~/signalr RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true }); } } }
اینبار اگر برنامه را اجرا کنید و سپس یکی از کلاینتهای آنرا فراخوانی نمائید، میتوان مشاهده کرد که کار وهله سازی و تزریق وابستگی سرویس مورد استفاده به صورت خودکار انجام گردیده است: