Mam projekty webapi2 C#, na których mam wszystkie kontrolery w folderze kontrolerów. Mam teraz pewne funkcje, które chcę dodać, ale chcę umieścić je w innym projekcie studia wizualnego, który będzie miał własny katalog kontrolerów (i modeli i widoków). Czy to możliwe, że mogę stworzyć jakiś moduł, który będzie ładowany przez webapi2?Kontrolery Webapi 2 na 2 projekty
Odpowiedz
Web API polega na IHttpControllerSelector wyboru kontrolera API do obsługi żądania, z których ma domyślną implementację, która opiera się na IAssembliesResolver rozwiązywania zestawy do wyszukiwania kontrolerów api.
Przy najmniejszej zmianie minimalnej, możesz zastąpić ten resolver składania niestandardową implementacją, która załaduje dla ciebie inne biblioteki.
bardzo naiwny Przykładem może wyglądać następująco:
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;
}
}
Następnie można zastąpić domyślny resolverowi z tym kodem
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver());
wewnątrz metody WebApiConfig
klasy Register
.
Następnie skopiuj wszystkie dodatkowe biblioteki z klasami kontrolerów do katalogu bin i gotowe.
Jeśli potrzebujesz jeszcze większego dostosowania do wyboru kontrolera, możesz przejść do niestandardowej implementacji IHttpControllerSelector
i zastąpić istniejącą implementację w podobny sposób.
Możesz utworzyć funkcjonalność w projekcie bibliotecznym, a następnie odnieść ten projekt do swojego webapi2 i innego projektu studyjnego. Zasadniczo będziesz miał trzy rozwiązania; dwa rozwiązania webapi i jedno rozwiązanie biblioteczne. Rozwiązanie biblioteki będzie zawierało wymaganą logikę dla dwóch rozwiązań webapi.
Nie powinieneś potrzebować kontrolerów w dwóch projektach.
Jeśli kontrolerzy są ZA CAŁKOWICIE różne domeny biznesowe, należy utworzyć dwa api w IIS w/dwóch rozwiązaniach.
Jeśli są podobne, utwórz wszystkie kontrolery w projekcie WWW. Następnie poproś te kontrolery, aby wywoływały oddzielne usługi aplikacji.
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
}
}
Tak więc większość logiki powinna schować się za usługami warstwy aplikacji, a te usługi powinny mieć metody odwzorowujące 1-1 w przypadkach użycia. Jeśli twoja domena biznesowa dla tych dwóch aplikacji jest zupełnie inna, po prostu utwórz dwa osobne rozwiązania i dwie osobne aplikacje IIS/api:
Można również rozważyć obszary. Web Api też to ma, prawda? –
Nie, nie jest to możliwe. Maksymalną możliwą czynnością jest utworzenie biblioteki klas, która skompiluje się jako DLL, a następnie odwołaj się do tej biblioteki DLL w WebApi. W przeciwnym razie będziesz zobowiązany do umieszczenia wszystkiego w tej samej aplikacji (WebApi) lub utworzenia dwóch różnych aplikacji WebApi.
zależności od potrzeb ...
Radzę, wystarczy umieścić kontrolery 2 na jednym projekcie i stworzyć pomocnika/folderu/klasy usługi w innym projekcie i nazywają te usługi tylko zajdzie taka potrzeba.
To nie jest tak naprawdę odpowiedź na twoje pytanie, ale wierzę, że to pomoże. Normalnie możemy stworzyć rozwiązanie przy użyciu tej struktury folderów, mam nadzieję, że to pomaga:
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) Umieść wszystkie kontrolery w projekcie WWW i poproś te kontrolery o połączenie z różnymi usługami (które znajdują się w innym projekcie). Niewielka, pozbawiona logiki (inna niż obsługa wyjątków/rejestracja) powinna znajdować się w kontrolerach. Powinni po prostu zawołać inną klasę, aby wykonała pracę. 2) Utwórz dwie osobne aplikacje w iis i utwórz nowe API. –