2016-07-05 4 views
0

В моем классе WebApiConfig.cs для проекта .NET 4.6.1 WebApi я хочу включить CORS, только если для параметра app в web.config установлено значение true , Обычно я читаю web.config AppSettings, используя класс AppSettings, который преобразует значения из строки в более подходящий тип данных. Я объявляю интерфейс IAppSettings и регистрирую тип с контейнером Autofac DI, который я использую.Как ввести зависимость в класс статической среды в C# WebApi

Однако в этом случае WebApiConfig является статическим классом, а его метод Register вызывается следующим образом: GlobalConfiguration.Configure (WebApiConfig.Register); Я не могу изменить подпись класса GlobalConfiguration.Configure, поэтому я не вижу, как добавить объект IAppSettings, чтобы сделать его доступным в методе Register. Конечно, я могу получить доступ к ConfigurationManager, но это кажется очень взломанным. Конечно, я мог бы объявить AppSettings как статический класс, но это затруднило бы тестирование модулей. Есть ли более чистый способ сделать это?

Вот соответствующий код; - ConfigurationManager линия является один я хочу заменить вызовом класса AppSettings:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     if (System.Configuration.ConfigurationManager.AppSettings.Get("IsCorsEnabled", false)) 
     { 
      config.EnableCors(); 
     } 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Большое спасибо за любую помощь !!

+0

Рассмотрим переход на ASP.Net Core, который решает все этих проблем. – SLaks

+0

Спасибо - я рассматривал это, но я обеспокоен тем, что Entity Framework Core не полностью зрелый - слышал, что он еще не поддерживает ленивую загрузку? Я пробовал хостинг .NET Core с таргетингом на .NET 4.6.1, но через 1,5 дня все еще не смог получить очень простое решение с проектом WebApi и работающим с Data (EntityFramework) проектом, похоже, не может найти всеобъемлющего руководства по как создавать проекты и ссылаться на них в этом сценарии - любые ссылки, которые делают это прямолинейно, также несомненно приветствуются! – user756366

ответ

2

Скажет у вас есть интерфейс, как это для ваших AppSettings (вид):

public interface IAppSettings 
{ 
    T Get<T>(string name); 
} 

и реализация по умолчанию это, которое просто обтекает ConfigurationManager:

public class DefaultAppSettings : IAppSettings 
{ 
    public T Get<T>(string name) 
    { 
     return (T)Convert.ChangeType(ConfigurationManager.AppSettings[name], typeof(T)); 
    } 
} 

Если затем определит class like this:

public static class CurrentAppSettings 
{ 
    public static Func<IAppSettings> Instance =() => new DefaultAppSettings(); 
} 

Вы можете использовать это в своем методе регистрации:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     if (CurrentAppSettings.Instance().Get<bool>("IsCorsEnabled")) 
     { 
      config.EnableCors(); 
     } 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Если вы хотите, чтобы придать некоторую другую реализацию этого, как и в тесте, вы просто установить экземпляр CurrentAppSettings на что-то другое:

[Test] 
public void SomeTest() 
{ 
    CurrentAppSettings.Instance =() => new SimpleKeyValueAppSettings(new Dictionary<string, string>()); 

    // ... 
} 
+0

Да, это имеет смысл! Разный подход, но это работает, выполняет все, что я надеялся выполнить. Большое спасибо! – user756366

Смежные вопросы