{"id":21047093,"url":"https://github.com/stakx/dynamicproxy.asyncinterceptor","last_synced_at":"2025-05-15T19:31:34.686Z","repository":{"id":131344210,"uuid":"260297555","full_name":"stakx/DynamicProxy.AsyncInterceptor","owner":"stakx","description":"`AsyncInterceptor` base class for Castle DynamicProxy that aims at full support for all awaitable types (including custom ones).","archived":false,"fork":false,"pushed_at":"2020-05-28T16:55:14.000Z","size":30,"stargazers_count":17,"open_issues_count":5,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-05-10T09:38:56.266Z","etag":null,"topics":["async","async-await","async-interceptor","awaitable","castle","castle-core","castle-dynamicproxy","dotnet","dotnet-standard","dynamicproxy","interceptor","netstandard20"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stakx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-30T19:15:00.000Z","updated_at":"2025-01-10T22:35:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"58aeac01-4364-4ea0-86f0-c938c658fea1","html_url":"https://github.com/stakx/DynamicProxy.AsyncInterceptor","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stakx%2FDynamicProxy.AsyncInterceptor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stakx%2FDynamicProxy.AsyncInterceptor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stakx%2FDynamicProxy.AsyncInterceptor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stakx%2FDynamicProxy.AsyncInterceptor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stakx","download_url":"https://codeload.github.com/stakx/DynamicProxy.AsyncInterceptor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254407360,"owners_count":22066222,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","async-await","async-interceptor","awaitable","castle","castle-core","castle-dynamicproxy","dotnet","dotnet-standard","dynamicproxy","interceptor","netstandard20"],"created_at":"2024-11-19T14:35:26.289Z","updated_at":"2025-05-15T19:31:34.362Z","avatar_url":"https://github.com/stakx.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AsyncInterceptor for Castle DynamicProxy\n\nThis small library provides an abstract base class `AsyncInterceptor` for [Castle DynamicProxy](https://github.com/castleproject/Core/blob/master/docs/dynamicproxy.md) which allows you to use .NET languages' `async`/`await` facilities during interception of awaitable methods.\n\nThis is currently in draft stage, but should be usable. Feedback and contributions are welcome!\n\n\n![.NET Core](https://github.com/stakx/AsyncInterceptor/workflows/.NET%20Core/badge.svg?branch=master)\n[![Nuget](https://img.shields.io/nuget/vpre/stakx.DynamicProxy.AsyncInterceptor?color=fa0\u0026label=NuGet)](https://nuget.org/packages/stakx.DynamicProxy.AsyncInterceptor)\n\n\n## Usage example\n\n```csharp\nclass Delay : AsyncInterceptor\n{\n    private readonly int milliseconds;\n\n    public Delay(int milliseconds)\n    {\n        this.milliseconds = milliseconds;\n    }\n\n    // This gets called when a non-awaitable method is intercepted:\n    protected override void Intercept(IInvocation invocation)\n    {\n        Thread.Sleep(this.milliseconds);\n        invocation.Proceed();\n    }\n\n    // Or this gets called when an awaitable method is intercepted:\n    protected override async ValueTask InterceptAsync(IAsyncInvocation invocation)\n    {\n        await Task.Delay(this.milliseconds);\n        await invocation.ProceedAsync();\n    }\n}\n\n\nclass Return : AsyncInterceptor\n{\n    private readonly object value;\n\n    public Return(object value)\n    {\n        this.value = value;\n    }\n\n    protected override void Intercept(IInvocation invocation)\n    {\n        invocation.ReturnValue = this.value;\n    }\n\n    protected override ValueTask InterceptAsync(IAsyncInvocation invocation)\n    {\n        // The property being set is called `Result` rather than `ReturnValue`.\n        // This is a hint that its value doesn't have to be wrapped up as a task-like object:\n        invocation.Result = this.value;\n        return default;\n    }\n}\n\n\npublic interface ICalculator\n{\n    int GetResult();\n    Task\u003cint\u003e GetResultAsync();\n}\n\n\nvar generator = new ProxyGenerator();\n\nvar proxy = generator.CreateInterfaceProxyWithoutTarget\u003cICalculator\u003e(\n    new Delay(2500),\n    new Return(42));\n\nAssert.Equal(42, proxy.GetResult());\nAssert.Equal(42, await proxy.GetResultAsync());\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstakx%2Fdynamicproxy.asyncinterceptor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstakx%2Fdynamicproxy.asyncinterceptor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstakx%2Fdynamicproxy.asyncinterceptor/lists"}