我是否需要将autofac的容器注册到自己的容器中,以连接webapi的depdendency resolver?

问题描述 投票:0回答:1

我正在使用Topshelf编写一个Windows服务,它应该启动一个自我托管的webapi项目和一个基于quickfixn的FIX服务。请考虑下面的缩短代码,到目前为止,它的工作。

然而有一个问题--现在有两个容器实例生活在我的应用程序中。我的直觉告诉我这是个坏主意,尤其是我正在加载 MyBigModule 两次。也是因为我的一个控制器需要的组件与使用quickfix的控制器相同。

// Assembly A referencing B
public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        buider.RegisterModule<MyBigModule>();
        var container = builder.Build();

        _ = HostFactory.Run(c => 
        {
            c.UseAutofacContainer(container);
            c.Service<IMyServiceManager>(svc => 
            {
                svc.ConstructUsingAutofacContainer();
                // ...
            }

            // ...
        });
    }
}

// Assembly B
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        var builder = new ContainerBuilder();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly())              
        var container = builder.Build();

        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        // ...

        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);
        app.UseWebApi(config);
    }
}

// Assembly B
public class WebHost : IWebHost
{
    // ...

    public void Start()
    {
        WebApp.Start<Startup>("someUrl");
    }
}

// Assembly B
public class MyBigModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register<WebHost>.As<IWebHost>();

        // ...
    }
}

我的第一个方法是通过一个 Action<IAppBuilder>WebHost 构造函数,它是在 Main(). 类似这样的东西。

public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterModule<MyBigModule>();
        var container = builder.Build();

        var webhost = new WebHost("someUrl", app => 
        {
            var config = new HttpConfiguration();            
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

            // ....
        });

        builder.RegisterInstance(webost); 

        // ... 
    }
}

但是我必须先建立我的容器,然后再添加另一个注册。这不符合容器应该被认为是不可改变的建议。另一种选择是将容器实例传递给我的 WebHosts Startup 类。

似乎我需要在容器本身内部对我的容器进行注册。我如何做到这一点?也许有更好的方法?我希望能清楚我在纠结什么。

我很确定一定有更好的方法来连接webapi的解析器。任何想法和反馈都非常感激。

asp.net-web-api2 owin autofac self-hosting topshelf
1个回答
0
投票

我解决了它的同时,由于 此职位. 我们可以注入一个 ILifetimeScope 到构造函数,而无需注册任何东西。

// Assembly A referencing B
public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        buider.RegisterModule<MyBigModule>();
        var container = builder.Build();

        _ = HostFactory.Run(c => 
        {
            c.UseAutofacContainer(container);
            c.Service<IMyServiceManager>(svc => 
            {
                svc.ConstructUsingAutofacContainer();
                // ...
            }

            // ...
        });
    }
}

// Assembly B
public class WebHost : IWebHost
{
    private readoly ILifetimeScope scope

    public WebHost(ILifetimeScope scope)
    {
        this.scope = scope;
    }

    public void Start()
    {
        WebApp.Start("someUri", app => {
            var config = new HttpConfiguration
            {
                DependencyResolver = new AutofacWebApiDependencyResolver(this.scope)
            };

            // ...
        });        
    }
}

// Assembly B
public class MyBigModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register<WebHost>.As<IWebHost>();

        // ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.