У меня проблемы с включением сигнализатора и автофаком.Я пытаюсь заставить их обоих играть вместе с простым проектом MVC 5.Я буду использовать простой пример.Во-первых, у меня есть концентратор сигналов, который я всегда вызываю с клиента, как это настроено в _Layout.cshtml
public class BookHub : Hub
{
private readonly IUserService UserService;
public BookHub(IUserService userService)
{
this.UserService = userService;
}
public void InvokeMe()
{
}
}
Каждый раз, когда я вызываю концентратор, я хочу внедрить интерфейс userservice.Затем у меня есть простой контроллер, в котором я также хочу ввести один и тот же интерфейс
public class UserController : Controller
{
IUserService UserService;
public UserController(IUserService userService)
{
this.UserService = userService; ;
}
public ActionResult Index()
{
return View();
}
}
Каждый раз, когда я вызываю концентратор и контроллер, я хочу ввести интерфейс IUserService
Итак, чтобыДля этого используют 2 метода.Тот, который регистрирует зависимости для signalr
public static class SignalR_Autofac
{
public static void RegisterSignalR(ContainerBuilder builder)
{
// Register Autofac resolver into container to be set into HubConfiguration later
builder.RegisterType<AutofacDependencyResolver>()
.As<Microsoft.AspNet.SignalR.IDependencyResolver>()
.SingleInstance();
// Register ConnectionManager as IConnectionManager so that you can get
// hub context via IConnectionManager injected to your service
builder.RegisterType<Microsoft.AspNet.SignalR.Infrastructure.ConnectionManager>()
.As<Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager>()
.SingleInstance();
//register services
builder.RegisterType<TestService>().As<ITestService>().InstancePerLifetimeScope();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();
builder.RegisterType<DbFactory>().As<IDbFactory>().InstancePerLifetimeScope();
builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
// Register hubs one by one
builder.RegisterType<AuthorHub>().ExternallyOwned();
builder.RegisterType<BookHub>().ExternallyOwned();
}
}
и один для mvc
public static class Bootstrapper
{
public static void SetAutofacMVCContainerLess(ContainerBuilder builder)
{
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
builder.RegisterModule(new AutofacDataModule());
builder.RegisterModule(new AutofacServiceModule());
builder.RegisterFilterProvider();
}
}
, так что я получаю в результате свой startup.cs, такой как
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
IContainer container = AutofacConfig(app);
app.UseAutofacMiddleware(container);
System.Web.Mvc.DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));
var hubConfiguration = new Microsoft.AspNet.SignalR.HubConfiguration()
{
Resolver = container.Resolve<Microsoft.AspNet.SignalR.IDependencyResolver>(),
};
app.MapSignalR(hubConfiguration);
}
private static IContainer AutofacConfig(IAppBuilder app)
{
var builder = new ContainerBuilder();
Bootstrapper.SetAutofacMVCContainerLess(builder);
SignalR_Autofac.RegisterSignalR(builder);
return builder.Build();
}
}
на каждомHTTP запрос интерфейс вводится в моем контроллере и в моем концентраторе.Мне было интересно, есть ли лучший способ зарегистрировать IUserService один раз, а не два раза как InstancePerRequest для mvc и один раз как InstancePerLifetimeScope для сигнализатора.Как вы можете видеть, мне также необходимо дважды зарегистрировать некоторые другие зависимости, такие как IUnitOfWork, IDbFactory и IUserRepository.
Часть решения для регистрации сигнализатора - с здесь