2016-02-22 4 views
2

У меня есть новое приложение, которое реализует архитектуру лука, теперь я хочу внедрить службу в класс запуска owin. Процесс ioc запускается до того, как он запустит класс запуска, который будет запущен в проекте bootstrapper, который запускается сначала с помощью webactivator. Можно ли внедрить услугу в класс запуска?Inject Service in Startup Owin

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); 
    } 
} 
+0

Почему вы не передаете провайдеру и/или услугу методу ConfigureOAuth? Это инвертирует контроль. Вам нужна запись, в которой вы настроили свой контейнер IOC, поэтому он также может быть в «StartUp». Кстати, вам не обязательно следовать соглашению «StartUp». Вы можете вручную запустить приложение owin, если хотите. –

+0

thnx для вашего комментария, но если я передаю сервис и/или провайдер в configureOAuth, я должен сначала передать его в методе конфигурации, потому что это вызывающий. Проблема в том, что я не могу выполнить настройку (IAppbuilder, service) beacause it throw исключение (Startup не имеет ожидаемой подписи «void Configuration (IAppBuilder)» ..) – moyomeh

+0

да, вы правы. Я покажу вам, как я это делаю. –

ответ

2

Вы не должны использовать StartUp конвенции и в тех случаях, как это было бы лучше, чтобы иметь полный контроль над трубопроводом приложение сборки. Это не дает прямого ответа на ваш вопрос, более подробный комментарий о том, как вы могли это сделать; В частности, вручную настройте AppBuilder и отправьте приложение на сервер Owin.

btw, я использую 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(); 
    } 
} 

Помните, что это псевдо-код, но вы получаете общую идею.

+0

Это хорошее начало, но мне интересно, если container.Get (); является анти-шаблоном. Контейнер в моем случае определен в другом проекте, поэтому, если я приму это решение, лучше использовать GlobalConfiguration.Configuration.DependencyResolver.GetService (typeof (IService )), который я не уверен в этом. – moyomeh

+0

@mmansouri обновлен, чтобы иметь корневой каталог и все, что было введено во все охватывающее «приложение» –