Интеграция с Autofac, SignalR и MVC 5 - PullRequest
       26

Интеграция с Autofac, SignalR и MVC 5

0 голосов
/ 03 октября 2018

У меня проблемы с включением сигнализатора и автофаком.Я пытаюсь заставить их обоих играть вместе с простым проектом 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.

Часть решения для регистрации сигнализатора - с здесь

...