2个项目的Webapi 2控制器

时间:2017-02-02 19:38:32

标签: c# visual-studio asp.net-web-api asp.net-web-api2

我有一个webapi2 C#项目,我在控制器文件夹中拥有所有控制器。 我现在有一些我想要添加的功能,但我想将它放在一个不同的visual studio项目中,该项目将拥有自己的控制器(以及模型和视图)文件夹。这是否可行,以便我可以创建某种将由webapi2加载的模块?

5 个答案:

答案 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