Asp.net mvc Asp.net MVC、WebApi、SignalR和Owin中的Autofac

Asp.net mvc Asp.net MVC、WebApi、SignalR和Owin中的Autofac,asp.net-mvc,asp.net-web-api,signalr,owin,autofac,Asp.net Mvc,Asp.net Web Api,Signalr,Owin,Autofac,如果Asp.net MVC、WebApi、SignalR无法与Owin一起使用,如何以良好的方式注册一个或多个Autofac依赖项解析程序?每一项都有指导方针。但正如下文所述,它似乎不起作用。这段代码有点糟糕,因为它使用了不同的依赖项解析,有些是静态的,它们似乎有一个存在的原因(看起来像是代码重复) 公共类启动 { //这两个静态解析器看起来不太好 公共静态IDependencyResolver信号PendencyResolver{get;private set;} public static

如果Asp.net MVC、WebApi、SignalR无法与Owin一起使用,如何以良好的方式注册一个或多个Autofac依赖项解析程序?每一项都有指导方针。但正如下文所述,它似乎不起作用。这段代码有点糟糕,因为它使用了不同的依赖项解析,有些是静态的,它们似乎有一个存在的原因(看起来像是代码重复)

公共类启动
{
//这两个静态解析器看起来不太好
公共静态IDependencyResolver信号PendencyResolver{get;private set;}
public static System.Web.Http.Dependencies.IDependencyResolver WebApiDependencyResolver{get;private set;}
公共无效配置(IAppBuilder应用程序)
{
var httpConfiguration=新的httpConfiguration();
var container=BuildAutofacContainer();
变量HUB配置=
新轮毂配置
{
分解器=新的AutofacDependencyResolver(容器),
EnableDetailedErrors=true
};
//此处使用的分解器。是否进一步被信号器替换?
// 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;
SetResolver(新的Autofac.Integration.Mvc.AutofacDependencyResolver(容器));
WebApiDependencyResolver=新的AutofacWebApiDependencyResolver(容器);
//为什么以下操作不起作用(需要无参数构造函数的抛出)?
//所以使用了静态解析器
//看http://docs.autofac.org/en/latest/integration/webapi.html#owin-整合
//httpConfiguration.DependencyResolver=新的AutofacWebApidencyResolver(容器);
app.useautofac中间件(容器);
app.UseAutofacWebApi(httpConfiguration);
app.UseAutofacMvc();
app.UseWebApi(httpConfiguration);
app.MapSignalR(“/signalr”,HUB配置);
//无网钩:
app.useCookie身份验证(
新CookieAuthenticationOptions
{
AuthenticationType=DefaultAuthenticationTypes.ApplicationOkie,
LoginPath=新路径字符串(“/Account/Login”)
});
}
专用静态IContainer BuildAutofacContainer()
{
var builder=new ContainerBuilder();
//及http://autofac.readthedocs.org/en/latest/integration/mvc.html#using-插件程序集
builder.RegisterModule();
builder.RegisterModule();
builder.RegisterType().As().SingleInstance();
RegistrationExtensions.RegisterController(生成器、类型化(MVCAPApplication).Assembly);
RegisterAppController(typeof(mvcapapplication).Assembly.InstancePerRequest();
registerUBS(Assembly.getExecutionGassembly());
var mvcContainer=builder.Build();
返回MVC容器;
}
}
WebAPI和MVC有不同的依赖项解析程序——对此您无能为力。您所能做的就是您所做的-针对同一容器注册每个解析器。是什么让你说这是“坏的”?@AntP它看起来很坏,因为1)有两个
静态
字段,一些控制器和集线器使用这些解析器,因此它们不容易测试;2) Owin的初始化看起来不太好,因为应该保持顺序;3) 这些部分应该有不同的解析器,不清楚为什么不使用一个解析器。Web API和MVC有不同的依赖项解析器-对此您无能为力。您所能做的就是您所做的-针对同一容器注册每个解析器。是什么让你说这是“坏的”?@AntP它看起来很坏,因为1)有两个
静态
字段,一些控制器和集线器使用这些解析器,因此它们不容易测试;2) Owin的初始化看起来不太好,因为应该保持顺序;3) 这些零件应该有不同的分解器,不清楚为什么不使用一个分解器。
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;
    }
}