c# - DryIoc.WebApi 设置

标签 c# asp.net-web-api dryioc

我正在探索 DryIoc 在 .NET WebAPI 应用程序中的使用,并注意到初始化步骤有一个奇怪的行为。在一个简单的测试 webapi 应用程序中,我有以下 DryIoc 注册类,它在 WebApi 配置注册后立即被调用。

public class DryIocConfig
{
    public static void Register(HttpConfiguration config)
    {
        var c = new Container().WithWebApi(config);

        c.Register<IWidgetService, WidgetService>(Reuse.Singleton);
        c.Register<IWidgetRepository, WidgetRepository>(Reuse.Singleton);
    }
}

以及以下 WebApi Controller :

public class ValuesController : ApiController
{
    private readonly IWidgetService _widgetService;

    public ValuesController(IWidgetService widgetService)
    {
        _widgetService = widgetService;
    }

    // GET api/values
    public IEnumerable<Widget> Get()
    {
        return _widgetService.GetWidgets();
    }
}

这似乎工作正常,但在我看来似乎是相同的,但写得有点冗长,代码我得到一个错误。

public class DryIocConfig
{
    public static void Register(HttpConfiguration config)
    {
        var c = new Container();
        c.WithWebApi(config);  // Now separate statement rather than chained. 

        c.Register<IWidgetService, WidgetService>(Reuse.Singleton);
        c.Register<IWidgetRepository, WidgetRepository>(Reuse.Singleton);
    }
}

我得到的异常如下(作为 JSON):

    {
        "Message" : "An error has occurred.",
        "ExceptionMessage" : "An error occurred when trying to create a controller of type 'ValuesController'. Make sure that the controller has a parameterless public constructor.",
        "ExceptionType" : "System.InvalidOperationException",
        "StackTrace" : "   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
        "InnerException" : {
            "Message" : "An error has occurred.",
            "ExceptionMessage" : "Type 'IOCContainerTest.DryLoc.Controllers.ValuesController' does not have a default constructor",
            "ExceptionType" : "System.ArgumentException",
            "StackTrace" : "   at System.Linq.Expressions.Expression.New(Type type)\r\n   at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
        }
    }

这对 DryIoc 来说是不是有些奇怪,或者这是我从未遇到过的 C# 细微差别?

最佳答案

这是因为 .WithWebApi() 是根据 source 的扩展方法.

 public static IContainer WithWebApi(this IContainer container, HttpConfiguration config,
        IEnumerable<Assembly> controllerAssemblies = null, IScopeContext scopeContext = null,
        Func<Type, bool> throwIfUnresolved = null)
    {
        container.ThrowIfNull();

        if (container.ScopeContext == null)
            container = container.With(scopeContext: scopeContext ?? new AsyncExecutionFlowScopeContext());

        container.RegisterWebApiControllers(config, controllerAssemblies);

        container.SetFilterProvider(config.Services);

        InsertRegisterRequestMessageHandler(config);

        config.DependencyResolver = new DryIocDependencyResolver(container, throwIfUnresolved);

        return container;
    }

在第一个语法示例中,您创建了一个新的 Container 实例,并将该新创建的实例传递给 .WithWebApi()。这反过来会更新容器实例,并最终将其返回给变量 c

在第二个语法示例中,您永远不会将扩展方法 BACK 的值返回到原始变量,更新它。您调用它就好像它是一个 void 方法,在这种情况下它什么都不做,因此是异常。

如果你改为写:

var c = new Container();
c = c.WithWebApi(config);

它本质上是第一种语法的更详细的示例,并且会使用新功能正确更新 c

关于c# - DryIoc.WebApi 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36899798/

相关文章:

c# - 使用 LINQ 获取每第 n 行

c# - 使用代码隐藏条件构建查询的最佳方法?

c# - 无法连接到 Controller 中的方法

c# - 使用依赖注入(inject)时避免单例存储库(DryIoc)

c# - 如何获取 XML 格式的 SOAP header ?

c# - 为什么 foreach 找不到我的 GetEnumerator 扩展方法?

c# - 配置路由到api到子文件夹

asp.net-web-api - 在 Dapper 中调用 QueryAsync 会抛出 InvalidOperationException

c# - 使用 Reuse.InWebRequest/Reuse.InThread 时使用 DryIoc 解析新实例

xamarin - Xamarin Prism无法导航到LoginPageViewModel