【问题标题】:Inject Service in Startup Owin在启动 Owin 中注入服务
【发布时间】:2016-02-22 13:56:18
【问题描述】:

我有一个实现洋葱架构的新应用程序,现在我想在 owin 的启动类中注入一个服务。 ioc 进程在启动类之前启动,因为它位于首先使用 webactivator 运行的引导程序项目中。是否可以在启动类中注入服务?

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();

        // Web API routes
        config.MapHttpAttributeRoutes();

        ConfigureOAuth(app);

        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

        app.UseWebApi(config);
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        // i want to use an injected service inside a provider :my problem :(  
        var providers = Providers(service);

        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            //For Dev enviroment only (on production should be AllowInsecureHttp = false)
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/generateToken"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            Provider = providers,
            AccessTokenFormat = new CustomJwtFormat("http://localhost:18292/")
        };

        // OAuth 2.0 Bearer Access Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
    }
}

【问题讨论】:

  • 为什么不将提供者和/或服务传递给ConfigureOAuth 方法?那就是反转控制。您需要一个设置 IOC 容器的条目,因此它也可以在 StartUp 中。顺便说一句,您不必遵循StartUp 约定。如果您愿意,可以手动启动一个 owin 应用程序。
  • 谢谢您的评论,但如果我在 configureOAuth 中传递服务和/或提供者,我应该首先在配置方法中传递它,因为它是调用者..问题是我不能做配置( IAppbuilder, service )因为它抛出异常( Startup 没有预期的签名 'void Configuration(IAppBuilder)' ..)
  • 是的,你是。我会告诉你我是怎么做的。

标签: c# dependency-injection owin onion-architecture


【解决方案1】:

您不必使用StartUp 约定,在这种情况下,最好完全控制应用构建管道。这并不能直接回答您的问题,而是对您如何做到这一点的扩展评论;具体来说,手动设置 AppBuilder 并将应用程序发送到 Owin 服务器。

顺便说一句,我在这里使用nowin 来制作实际的服务器。我相信其他人会用 Asp.Net 的方式来回答这个问题。

using AppFunc = Func<IDictionary<string, object>, Task>;

public class App
{
    private IAppBuilder _appBuilder;
    private HttpConfiguration _config;
    private ISomeServiceProvider _provider;

    public App(IAppBuilder appBuilder, ISomeServiceProvider provider, HttpConfiguration config)
    {
        _appBuilder = appBuilder;
        _provider = provider;
        _config = config;

        ConfigureOAuth(_appBuilder, provider);

        _appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        _appBuilder.UseWebApi(config);

        //Build Owin App
        _owinApp = (AppFunc) _appBuilder.Build(typeof (AppFunc));


    }

    void ConfigureOAuth(IAppBuilder app)
    {
        //...
    }

    public void Start()
    {
        //Make an endpoint
        var owinEndpoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 8080);

        //Build WebServer (Nowin)
        var owinServer = ServerBuilder.New()
            .SetOwinApp(_owinApp)
            .SetEndPoint(owinEndpoint)
            .Build();

        // Start WebServer
        using (owinServer)
        {
            owinServer.Start();

            Console.WriteLine("Press ENTER to stop");
            Console.ReadLine();
        }
    }
}

现在在引导程序/启动阶段的某个地方,将应用程序添加到容器中,解析并运行它。

public class Program
{
    public static void Main(string[] args)
    {
        var container = GetIoC();

        container.Bind<App>().ToSelf();
        container.Bind<IAppBuilder>().To(()=>new AppBuilder());
        container.Bind<HttpConfiguration>();
        // ... other bindings you need 

        //resolve root
        var app = container.Get<App>();

        app.Start(); 
    }
}

请记住,这是伪代码,但您大致了解。

【讨论】:

  • 这是一个好的开始,但我想知道 container.Get();是一种反模式。在我的情况下,容器是在其他项目中定义的,所以如果我将采用这个解决方案,最好使用 GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IService)) 我不确定它..
  • @mmansouri 更新为拥有一个根并将所有内容注入到一个包罗万象的App
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多