У меня есть проекты webapi2 C#, на которых у меня есть все контроллеры в папке контроллеров. Теперь у меня есть функциональность, которую я хочу добавить, но я хочу поместить ее в другой проект визуальной студии, который будет иметь свои собственные папки контроллеров (и модели и представления). Возможно ли, что я могу создать какой-то модуль, который будет загружен webapi2?Контроллеры Webapi 2 по 2 проектам
ответ
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
и заменить существующую реализацию аналогичным образом.
Вы можете создать функциональность в проекте библиотеки, а затем ссылаться на этот проект на свой webapi2 и на другой проект визуальной студии. В основном у вас будет три решения; два решения webapi и одно библиотечное решение. Библиотечное решение будет содержать требуемую логику, необходимую для двух решений webapi.
У вас не должно быть необходимости в контроллерах в двух проектах.
Если контроллеры предназначены для ПОЛНО разных доменов бизнеса, сделайте два 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
Вы также можете рассмотреть площадь. У Web Api тоже есть, верно? –
Нет, это невозможно. Максимум, который вы можете сделать, это создать библиотеку классов, которая будет компилироваться как DLL, а затем ссылаться на эту DLL в вашем WebApi. В противном случае вы будете обязаны либо поместить все в одно приложение (WebApi), либо создать два разных приложения WebApi.
В зависимости от ваших потребностей ...
Мой совет, просто поставить 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
1) Поместите все контроллеры в веб-проект и попросите этих контроллеров обратиться к различным службам (которые живут в другом проекте). Мало, ни одна логика (кроме обработки исключений/ведения журнала) не должна находиться в ваших контроллерах. Они должны просто позвонить в другой класс, чтобы выполнить эту работу. 2) Создайте два отдельных приложения под iis и создайте новый api. –