我有一个webapi2 C#项目,我在控制器文件夹中拥有所有控制器。 我现在有一些我想要添加的功能,但我想将它放在一个不同的visual studio项目中,该项目将拥有自己的控制器(以及模型和视图)文件夹。这是否可行,以便我可以创建某种将由webapi2加载的模块?
答案 0 :(得分:1)
Web Api依赖于IHttpControllerSelector来选择用于处理请求的api控制器,该请求具有默认实现,该实现依赖于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 :(得分:-1)
您可以在库项目中创建功能,然后将该项目引用到您的webapi2和您的其他Visual Studio项目。基本上你会有三个解决方案;两个webapi解决方案和一个库解决方案。库解决方案将包含两个webapi解决方案所需的逻辑。
答案 2 :(得分:-1)
您不应该在两个项目中需要控制器。
如果控制器完全用于不同的业务域,请在IIS中使用两个解决方案制作两个api。
如果它们相似,请在Web项目中创建所有控制器。然后让这些控制器调用单独的应用程序服务。
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
答案 3 :(得分:-1)
不,这是不可能的。您可以做的最大事情是创建一个将作为DLL编译的类库,然后在WebApi中引用该DLL。否则,您将被迫将所有内容放在同一个应用程序(WebApi)中或创建两个不同的WebApi应用程序。
答案 4 :(得分:-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