2017-02-02 7 views
5

У меня есть проекты webapi2 C#, на которых у меня есть все контроллеры в папке контроллеров. Теперь у меня есть функциональность, которую я хочу добавить, но я хочу поместить ее в другой проект визуальной студии, который будет иметь свои собственные папки контроллеров (и модели и представления). Возможно ли, что я могу создать какой-то модуль, который будет загружен webapi2?Контроллеры Webapi 2 по 2 проектам

+1

1) Поместите все контроллеры в веб-проект и попросите этих контроллеров обратиться к различным службам (которые живут в другом проекте). Мало, ни одна логика (кроме обработки исключений/ведения журнала) не должна находиться в ваших контроллерах. Они должны просто позвонить в другой класс, чтобы выполнить эту работу. 2) Создайте два отдельных приложения под iis и создайте новый api. –

ответ

0

Web Api опирается на IHttpControllerSelector для выбора контроллера апи для обработки запроса, из которых имеет реализацию по умолчанию, которая опирается на IAssembliesResolver для решения сборки для поиска контроллеров api.

В минимальном минимальном изменении вы можете заменить этот преобразователь на пользовательскую реализацию, которая будет загружать для вас другие библиотеки.

очень наивный пример может выглядеть следующим образом:

public class CustomAssemblyResolver : IAssembliesResolver 
{ 
    public List<string> PluginNames { get; set; } 

    public CustomAssemblyResolver() 
    { 
     PluginNames = new List<string>(); 

     //Add the custom libraries here 
     PluginNames.Add("Your_Second_Library"); 
    } 

    public ICollection<Assembly> GetAssemblies() 
    { 
     var asms = AppDomain.CurrentDomain.GetAssemblies().ToList(); 
     foreach (var name in PluginNames) 
     { 

      var asmPath = System.IO.Path.Combine(HostingEnvironment.MapPath("~/"), name + ".dll"); 
      try 
      { 
       var asm= System.Reflection.Assembly.LoadFrom(asmPath); 
       if(!asms.Contains(asm)) 
        asms.Add(asm); 
      } 
      catch (Exception) 
      { 

      } 
     } 
     return asms; 
    } 
} 

Вы можете заменить распознаватель по умолчанию с этим кодом

config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver()); 

внутри Register метода WebApiConfig класса.

Затем скопируйте все свои дополнительные библиотеки с классами контроллеров в каталог bin, и все готово.

Если вам нужна еще одна настройка для выбора контроллера, вы можете перейти к пользовательской реализации IHttpControllerSelector и заменить существующую реализацию аналогичным образом.

-1

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

-1

У вас не должно быть необходимости в контроллерах в двух проектах.

Если контроллеры предназначены для ПОЛНО разных доменов бизнеса, сделайте два api в IIS с двумя решениями.

Если они похожи, создайте все свои контроллеры в веб-проекте. Затем вызовите эти контроллеры для отдельных приложений.

public CustomerAccountsController : ApiController 
{ 
    private CustomerAccountService _customerAccountService; // lives in application layer project 
    public CustomerAccountsController() 
    { 
     // di stuff 
    } 

    public HttpResponseMessage PutCancelAccount(int accountId) 
    { 
     // exception handling + logging 
     _customerAccountService.CancelAccount(accountId); 

     // return status code if success, or if an exception 
    } 
} 

public OrderController : ApiController 
{ 
    private OrderService _orderService; // lives in application layer project 
    public OrderController() 
    { //di stuff 
    } 

    public HttpResponseMessage PostCreateOrder(CreateOrderRequest createOrderRequest) 
    { 
     // exception handling + logging 
     _orderService.TakeOrder(createOrderRequest); 

     // return status code if success, or if an exception 
    } 
} 

Таким образом, большая часть вашей логики должна скрываться за услугами прикладного уровня, и эти службы должны иметь методы, которые отображают 1-1 для использования случаев. Если ваш бизнес-домен для этих двух приложений полностью отличается, просто создайте два отдельных решения и два отдельных приложения IIS/api's

+0

Вы также можете рассмотреть площадь. У Web Api тоже есть, верно? –

-1

Нет, это невозможно. Максимум, который вы можете сделать, это создать библиотеку классов, которая будет компилироваться как DLL, а затем ссылаться на эту DLL в вашем WebApi. В противном случае вы будете обязаны либо поместить все в одно приложение (WebApi), либо создать два разных приложения WebApi.

-1

В зависимости от ваших потребностей ...

Мой совет, просто поставить 2 контроллера на одном проекте и создать вспомогательный/папки службы/класса в вашем другом проекте и назвать те услуги, когда вам нужно.

Это не ответ на ваш вопрос, но я считаю, что это поможет. Обычно мы создаем решения, используя эту структуру папок, я надеюсь, что это помогает:

MyTeamSolution 
    - MyTeam.Core = Class libraries 
     > Models 
      > Model1.cs 
      > Model2.cs 
      > Model3.cs 
     > Interface 
      > ISomeInterface.cs 
     > Helpers 
      > HelperClass.cs 

    - MyTeam.Api = webapi project 
     > Model1Controller.cs 
     > Model2Controller.cs 
     > Model3Controller.cs 
    - MyTeam.Web = mvc project 
     > Controllers 
     > Models 
     > Views 
     > etc. 
    - MyTeam.Sql = Class libraries 
     > MyTeamDbContext.cs 

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

  • Нет связанных вопросов^_^