在Asp.net MVC,WebApi,SignalR,Owin中再次使用Autofac

时间:2015-08-01 14:21:28

标签: asp.net-mvc asp.net-web-api signalr owin autofac

如果Asp.net MVC,WebApi,SignalR不能与Owin一起工作,如何以一种好的方式注册一个Autofac依赖解析器或解析器?每个都有指导方针。但如下所述它似乎不起作用。这里的代码有些不好,因为它使用了不同的依赖解析,有些是静态的,它们似乎有一个存在的理由(所以看起来像代码重复)。

public class Startup
{
    // This two static resolvers does not look nice
    public static IDependencyResolver SignalRDependencyResolver { get; private set; }

    public static System.Web.Http.Dependencies.IDependencyResolver WebApiDependencyResolver { get; private set; }

    public void Configuration(IAppBuilder app)
    {
        var httpConfiguration = new HttpConfiguration();

        var container = BuildAutofacContainer();

        var hubConfiguration =
            new HubConfiguration
            {
                Resolver = new AutofacDependencyResolver(container),
                EnableDetailedErrors = true
            };
        // The resolver to be used as here. Seems to be replaced by SignalR further? 
        // 1. http://stackoverflow.com/questions/20139127/signalr-sending-data-using-globalhost-connectionmanager-not-working/20202040#20202040
        // 2. http://stackoverflow.com/questions/20561196/signalr-calling-client-method-from-outside-hub-using-globalhost-connectionmanage
        SignalRDependencyResolver = hubConfiguration.Resolver;

        DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));

        WebApiDependencyResolver = new AutofacWebApiDependencyResolver(container);

        // Why the following does not work (throws that needs parameterless constructor) ? 
        // so the static resolver used
        // see http://docs.autofac.org/en/latest/integration/webapi.html#owin-integration
        // httpConfiguration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(httpConfiguration);
        app.UseAutofacMvc();
        app.UseWebApi(httpConfiguration);
        app.MapSignalR("/signalr", hubConfiguration);

        // AspNetIdentity hook:
        app.UseCookieAuthentication(
            new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login")
            });
    }

    private static IContainer BuildAutofacContainer()
    {
        var builder = new ContainerBuilder();

        // and http://autofac.readthedocs.org/en/latest/integration/mvc.html#using-plugin-assemblies 
        builder.RegisterModule<AutofacDalModule>();
        builder.RegisterModule<AutofacDomainModule>();
        builder.RegisterType<OperatorHubInternal>().As<IOperatorHubInternal>().SingleInstance();
        RegistrationExtensions.RegisterControllers(builder, typeof(MvcApplication).Assembly);
        builder.RegisterApiControllers(typeof(MvcApplication).Assembly).InstancePerRequest();
        builder.RegisterHubs(Assembly.GetExecutingAssembly());

        var mvcContainer = builder.Build();
        return mvcContainer;
    }
}

0 个答案:

没有答案