@ -1,35 +0,0 @@ |
|||
#THIS IS NOT BEING USED CURRENTLY. RELEASE GITHUB MANUALLY |
|||
|
|||
# Import the module dynamically from the PowerShell Gallery. Use CurrentUser scope to avoid having to run as admin. |
|||
Import-Module -Name new-github-release-function.psm1 |
|||
|
|||
# Specify the parameters required to create the release. Do it as a hash table for easier readability. |
|||
$newGitHubReleaseParameters = |
|||
@{ |
|||
GitHubUsername = 'abpframework' |
|||
GitHubRepositoryName = 'abp' |
|||
GitHubAccessToken = '*******************' |
|||
ReleaseName = "5.0.0-rc.2" |
|||
TagName = "5.0.0-rc.2" |
|||
ReleaseNotes = "N/A" |
|||
#AssetFilePaths = @('C:\MyProject\Installer.exe','C:\MyProject\Documentation.md') |
|||
IsPreRelease = $true |
|||
IsDraft = $true # Set to true when testing so we don't publish a real release (visible to everyone) by accident. |
|||
} |
|||
|
|||
# Try to create the Release on GitHub and save the results. |
|||
$result = New-GitHubRelease @newGitHubReleaseParameters |
|||
|
|||
# Provide some feedback to the user based on the results. |
|||
if ($result.Succeeded -eq $true) |
|||
{ |
|||
Write-Output "Release published successfully! View it at $($result.ReleaseUrl)" |
|||
} |
|||
elseif ($result.ReleaseCreationSucceeded -eq $false) |
|||
{ |
|||
Write-Error "The release was not created. Error message is: $($result.ErrorMessage)" |
|||
} |
|||
elseif ($result.AllAssetUploadsSucceeded -eq $false) |
|||
{ |
|||
Write-Error "The release was created, but not all of the assets were uploaded to it. View it at $($result.ReleaseUrl). Error message is: $($result.ErrorMessage)" |
|||
} |
|||
@ -0,0 +1,86 @@ |
|||
param( |
|||
[string]$branchName, |
|||
[string]$version, |
|||
[string]$isRcVersion, |
|||
[string]$isDraft, |
|||
[string]$gitHubApiKey |
|||
) |
|||
|
|||
. ..\nupkg\common.ps1 |
|||
|
|||
Write-Info "Publishing GitHub Release..." ## Further info see https://docs.github.com/en/rest/reference/releases |
|||
|
|||
if ($isRcVersion -eq "") |
|||
{ |
|||
$isRcVersion = Read-Host "Is this a RC/Preview version? (y/n)" |
|||
} |
|||
|
|||
if ($gitHubApiKey -eq "") |
|||
{ |
|||
$gitHubApiKey = Read-File "github-api-key.txt" |
|||
echo "GitHub API Key assigned from github-api-key.txt" |
|||
} |
|||
|
|||
if(!$gitHubApiKey) |
|||
{ |
|||
$gitHubApiKey = Read-Host "Enter the GitHub API Key" |
|||
} |
|||
|
|||
if ($version -eq "") |
|||
{ |
|||
$version = Get-Current-Version # The version number for this release |
|||
} |
|||
|
|||
if ($branchName -eq "") |
|||
{ |
|||
$branchName = Get-Current-Branch # The branch name also the tag name |
|||
} |
|||
|
|||
if ($isDraft -eq "") |
|||
{ |
|||
$draft = $FALSE |
|||
} |
|||
else |
|||
{ |
|||
$draft = [boolean]::Parse($isDraft) |
|||
} |
|||
|
|||
############################################################################## |
|||
$preRelease = ( ($isRcVersion -eq "true") -or ($isRcVersion -eq "y") -or ($isRcVersion -eq "rc") ) # Set to true to mark this as a pre-release version |
|||
$gitHubUsername = 'abpframework' # The github username |
|||
$gitHubRepository = 'abp' # The github repository name |
|||
$releaseNotes = '' # The notes to accompany this release, uses the commit message in this case |
|||
############################################################################## |
|||
|
|||
echo "Current version: $version" |
|||
echo "Current branch: $branchName" |
|||
echo "Preview version: $preRelease" |
|||
echo "Draft: $draft" |
|||
|
|||
############################################################################## |
|||
|
|||
$releaseData = @{ |
|||
tag_name = $version; |
|||
target_commitish = $branchName; |
|||
name = $version; |
|||
body = $releaseNotes; |
|||
draft = $draft; |
|||
prerelease = $preRelease; |
|||
} |
|||
|
|||
$releaseParams = @{ |
|||
Uri = "https://api.github.com/repos/$gitHubUsername/$gitHubRepository/releases"; |
|||
Method = 'POST'; |
|||
Headers = @{ |
|||
Authorization = 'Basic ' + [Convert]::ToBase64String( |
|||
[Text.Encoding]::ASCII.GetBytes($gitHubApiKey + ":x-oauth-basic")); |
|||
} |
|||
ContentType = 'application/json'; |
|||
Body = (ConvertTo-Json $releaseData -Compress) |
|||
} |
|||
|
|||
$response = Invoke-RestMethod @releaseParams |
|||
|
|||
echo "---------------------------------------------" |
|||
echo "$version has been successfully released." |
|||
|
|||
@ -0,0 +1,43 @@ |
|||
param( |
|||
[string]$branch, |
|||
[string]$newVersion, |
|||
[string]$isRcVersion |
|||
) |
|||
|
|||
. ..\nupkg\common.ps1 |
|||
|
|||
if (!$branch) |
|||
{ |
|||
$branch = Read-Host "Enter the branch name" |
|||
} |
|||
|
|||
if (!$newVersion) |
|||
{ |
|||
$currentVersion = Get-Current-Version |
|||
$newVersion = Read-Host "Current version is '$currentVersion'. Enter the new version (empty for no change) " |
|||
if($newVersion -eq "") |
|||
{ |
|||
$newVersion = $currentVersion |
|||
} |
|||
} |
|||
|
|||
if ($isRcVersion -eq "") |
|||
{ |
|||
$isRcVersion = Read-Host "Is this a RC/Preview version? (y/n)" |
|||
} |
|||
|
|||
$publishGithubReleaseParams = @{ |
|||
branchName=$branch |
|||
isRcVersion=$isRcVersion |
|||
} |
|||
|
|||
|
|||
./1-fetch-and-build.ps1 $branch $newVersion |
|||
./2-nuget-pack.ps1 |
|||
./3-nuget-push.ps1 |
|||
./4-npm-publish-mvc.ps1 |
|||
./5-npm-publish-angular.ps1 |
|||
./6-git-commit.ps1 |
|||
./7-publish-github-release.ps1 @publishGithubReleaseParams |
|||
./8-download-release-zip.ps1 |
|||
|
|||
@ -0,0 +1,149 @@ |
|||
# ABP.IO Platform 5.1 Has Been Released |
|||
|
|||
Today, we are releasing the [ABP Framework](https://abp.io/) and the [ABP Commercial](https://commercial.abp.io/) version 5.1 (with a version number `5.1.1`). This blog post introduces the new features and important changes in this new version. |
|||
|
|||
> **Warning** |
|||
> |
|||
> For a long time we were releasing RC (Release Candidate) versions a few weeks before every minor and major release. **This version has been released without a preview version.** This is because we've accidently released all the packages with a stable version number, without a `-rc.1` suffix and there is no clear way to unpublish all the NuGet and NPM packages. Sorry about that. However, it doesn't mean that this release is buggy. We've already resolved known problems. We will publish one or more patch releases if needed. You can follow [this milestone](https://github.com/abpframework/abp/milestone/64?closed=1) for known problems or submit your own bug report. If you are worried about its stability, you can wait for the next patch release. |
|||
|
|||
## Get Started with the 5.1 |
|||
|
|||
follow the steps below to try the version 5.1 today; |
|||
|
|||
1) **Upgrade** the ABP CLI to the latest version using a command line terminal: |
|||
|
|||
````bash |
|||
dotnet tool update Volo.Abp.Cli -g |
|||
```` |
|||
|
|||
**or install** if you haven't installed before: |
|||
|
|||
````bash |
|||
dotnet tool install Volo.Abp.Cli -g |
|||
```` |
|||
|
|||
2) Create a **new application**: |
|||
|
|||
````bash |
|||
abp new BookStore |
|||
```` |
|||
|
|||
See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options. |
|||
|
|||
> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page. |
|||
|
|||
You can use any IDE that supports .NET 6.x development (e.g. [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)). |
|||
|
|||
### Migration Notes & Breaking Changes |
|||
|
|||
This is an minor feature release, mostly with enhancements and improvements based on the [version 5.0](https://blog.abp.io/abp/ABP-IO-Platform-5-0-Final-Has-Been-Released). There is no breaking change except the Angular UI upgrade. ABP 5.1 startup templates use **Angular 13**. |
|||
|
|||
### Angular UI |
|||
|
|||
**If you want to upgrade ABP Framework but want to continue with Angular 12**, add the following section to `package.json` file of the Angular project: |
|||
|
|||
````json |
|||
"resolutions": { |
|||
"ng-zorro-antd": "^12.1.1", |
|||
"@ng-bootstrap/ng-bootstrap": "11.0.0-beta.2" |
|||
} |
|||
```` |
|||
|
|||
## What's new with ABP Framework 5.1? |
|||
|
|||
In this section, I will introduce some major features released with this version. |
|||
|
|||
### The new hosting model |
|||
|
|||
ABP startup application template now uses the new ASP.NET Core hosting APIs ([see the Microsoft's minimal APIs document](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0)) on application startup ([see the exact place in the ABP startup template](https://github.com/abpframework/abp/blob/46cdfbe7b06c93690181633be4e96bf62e7f34e2/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/Program.cs#L33-L40)). So, the `Startup.cs` file has been removed. |
|||
|
|||
Old-style hosting logic will continue to work as long as ASP.NET Core supports it. It is recommended to switch to the new model if possible for your solution. See [this guide](https://docs.abp.io/en/abp/latest/Migration-Guides/Upgrading-Startup-Template) if you need to know how you can to do that. |
|||
|
|||
### Asynchronous startup lifecycle methods |
|||
|
|||
The new hosting model allows us to execute asynchronous code on application initialization in [ABP module](https://docs.abp.io/en/abp/latest/Module-Development-Basics) classes. If you are using the new hosting model (which is default with 5.1 startup templates), you can override the `Async` versions of the module lifecycle methods. |
|||
|
|||
For example, you can now override the `ConfigureServicesAsync` (instead of `ConfigureServices`) or `OnApplicationInitializationAsync` (instead of `OnApplicationInitialization`) as shown in the following code block: |
|||
|
|||
````csharp |
|||
public class MyModule : AbpModule |
|||
{ |
|||
public override async Task ConfigureServicesAsync(ServiceConfigurationContext context) |
|||
{ |
|||
/* You can use await here and safely execute other async methods */ |
|||
} |
|||
|
|||
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) |
|||
{ |
|||
/* You can use await here and safely execute other async methods */ |
|||
} |
|||
} |
|||
```` |
|||
|
|||
If you override both of asynchronous and synchronous versions of the same method, only the asynchronous one will be executed. So, override only one of them based on your needs. |
|||
|
|||
### eShopOnABP is getting mature |
|||
|
|||
Our team is working to finalize the [eShopOnAbp](https://github.com/abpframework/eShopOnAbp) example solution, which is a reference **microservice solution** built with the ABP Framework. They will explain the project status and show what's done in the next **ABP Community Talks** meeting (see the *ABP Community Talks 2021.1* section below in this post). |
|||
|
|||
### The new ABP.IO design! |
|||
|
|||
We were working on a new design for the [abp.io](https://abp.io/) websites for a while. We are making the final touches; the new design will be live very soon. Here a screenshot from the design work: |
|||
|
|||
 |
|||
|
|||
[ABP Commercial](https://commercial.abp.io/) and [ABP Community](https://community.abp.io/) websites will also have new designs as a part of this update. |
|||
|
|||
### Other changes |
|||
|
|||
Here some other notable changes that come with this release: |
|||
|
|||
* Support markdown in [CMS-Kit comments ](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Comments)feature ([#10792](https://github.com/abpframework/abp/pull/10792)) |
|||
* Used file scoped namespaces for all the ABP Framework source code :) ([#10552](https://github.com/abpframework/abp/pull/10696)) |
|||
|
|||
All issues & PRs in [5.1 milesone](https://github.com/abpframework/abp/milestone/60?closed=1). |
|||
|
|||
### About the ABP Commercial |
|||
|
|||
The core team is also working on the ABP Commercial (which provides pre-built modules, themes, tooling and support on top of the ABP Framework). We've done a lot of minor improvements and fixes to the modules and tooling. |
|||
|
|||
One exiting new is about the **LeptonX theme**; We are working on to make it available in **MVC (Razor Pages)** and **Blazor** UI options too (in addition to the Angular UI). We are also adding more components, layout options, demo pages, etc... We are planning to release a beta version in the next weeks. Here an animated GIF from the dashboard we've prepared as a demonstration: |
|||
|
|||
 |
|||
|
|||
If you are wondering what is the LeptonX project, please see [that blog post](https://blog.abp.io/abp/LeptonX-Theme-for-ABP-Framework-Alpha-Release). |
|||
|
|||
As another visible functionality, we've added a new feature to the [CMS Kit Pro](https://docs.abp.io/en/commercial/latest/modules/cms-kit/index) module that is used to forward a URL to another URL. This is a screenshot from the management UI: |
|||
|
|||
 |
|||
|
|||
This feature can be used to create short URLs in your application (like URL shortening services provide) or forward old pages to their new URLs. |
|||
|
|||
In addition to the new features shipped in every minor version, we are working on long-term projects for ABP.IO Platform and ABP Commercial (a little secret for now :). We will have announcements once these projects get mature. |
|||
|
|||
## Community News |
|||
|
|||
### ABP Community Talks 2021.1 |
|||
|
|||
 |
|||
|
|||
This is the second episode of the ABP Community Talks and we are talking about microservice development with the ABP Framework, based on the [eShopOnAbp](https://github.com/abpframework/eShopOnAbp) reference solution. We will also briefly talk about the changes that come with ABP version 5.1. This **live meeting** will be at **January 20, 2022, 17:00 (UTC)** on YouTube. |
|||
|
|||
**Join this event on the Kommunity platform: https://kommunity.com/volosoft/events/abp-community-talks-20221-microservice-development-acd0f44b** |
|||
|
|||
You can also [subscribe to the Volosoft channel](https://www.youtube.com/channel/UCO3XKlpvq8CA5MQNVS6b3dQ) for reminders for further ABP events and videos. |
|||
|
|||
### New ABP Community posts |
|||
|
|||
Here, some of the recent posts added to the [ABP community](https://community.abp.io/): |
|||
|
|||
* [Minimal API development with the ABP Framework](https://community.abp.io/articles/minimal-api-with-abp-hello-world-part-1-sg5i44p8) by [@antosubash](https://github.com/antosubash) (three parts, video tutorial). |
|||
* [Integrating the Syncfusion MVC Components to the ABP MVC UI](https://community.abp.io/articles/integrating-the-syncfusion-mvc-components-to-the-abp-mvc-ui-0gpkr1if) by [@EngincanV](https://github.com/EngincanV). |
|||
* [Add Tailwind CSS to your ABP Blazor UI](https://community.abp.io/articles/add-tailwindcss-to-your-abp-blazor-ui-vidiwzcy) by [@antosubash](https://github.com/antosubash) (video tutorial). |
|||
* [Import external users into the users Table from an ABP Framework application](https://community.abp.io/articles/import-external-users-into-the-users-table-from-an-abp-framework-application-7lnyw415) by [@bartvanhoey](https://github.com/bartvanhoey). |
|||
|
|||
Thanks to the ABP Community for all the contents they have published. You can also [post your ABP and .NET related (text or video) contents](https://community.abp.io/articles/submit) to the ABP Community. |
|||
|
|||
## Conclusion |
|||
|
|||
In this blog post, I summarized the news about that new version and the ABP Community. Please try it and provide feedback by opening issues on [the GitHub repository](https://github.com/abpframework/abp). Thank you all! |
|||
|
After Width: | Height: | Size: 559 KiB |
|
After Width: | Height: | Size: 6.6 MiB |
|
After Width: | Height: | Size: 162 KiB |
|
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,111 @@ |
|||
# How to Test Blazor Components in ABP |
|||
|
|||
## Source Code |
|||
|
|||
You can find the source of the example solution used in this article [here](https://github.com/abpframework/abp-samples/tree/master/BlazorPageUniTest). |
|||
|
|||
|
|||
In this article, I will use [bUnit](https://github.com/bUnit-dev/bUnit) for a simple test of a Blazor component. |
|||
|
|||
## Getting Started |
|||
|
|||
Use the ABP CLI to create a blazor app |
|||
|
|||
`abp new BookStore -t app -u blazor` |
|||
|
|||
Then add the `BookStore.Blazor.Tests` xunit test project to the solution, and add [bUnit](https://github.com/bUnit-dev/bUnit) package and `ProjectReference` to the test project. |
|||
|
|||
The contents of `BookStore.Blazor.Tests.csproj` |
|||
```xml |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net6.0</TargetFramework> |
|||
<Nullable>enable</Nullable> |
|||
<IsPackable>false</IsPackable> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="bunit" Version="1.2.49" /> |
|||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" /> |
|||
<PackageReference Include="Volo.Abp.Authorization.Abstractions" Version="5.0.1" /> |
|||
<PackageReference Include="xunit" Version="2.4.1" /> |
|||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"> |
|||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
|||
<PrivateAssets>all</PrivateAssets> |
|||
</PackageReference> |
|||
<PackageReference Include="coverlet.collector" Version="3.1.0"> |
|||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
|||
<PrivateAssets>all</PrivateAssets> |
|||
</PackageReference> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\src\BookStore.Blazor\BookStore.Blazor.csproj" /> |
|||
<ProjectReference Include="..\BookStore.EntityFrameworkCore.Tests\BookStore.EntityFrameworkCore.Tests.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
``` |
|||
|
|||
Create `BookStoreBlazorTestModule` that depends on `AbpAspNetCoreComponentsModule` and `BookStoreEntityFrameworkCoreTestModule`. |
|||
|
|||
```cs |
|||
[DependsOn( |
|||
typeof(AbpAspNetCoreComponentsModule), |
|||
typeof(BookStoreEntityFrameworkCoreTestModule) |
|||
)] |
|||
public class BookStoreBlazorTestModule : AbpModule |
|||
{ |
|||
|
|||
} |
|||
``` |
|||
|
|||
Create a `BookStoreBlazorTestBase` class and add the `CreateTestContext` method. The `CreateTestContext` have key code. |
|||
|
|||
It uses ABP's `ServiceProvider` as a fallback `ServiceProvider` and add all ABP's services to the `TestContext`. |
|||
|
|||
```cs |
|||
public abstract class BookStoreBlazorTestBase : BookStoreTestBase<BookStoreBlazorTestModule> |
|||
{ |
|||
protected virtual TestContext CreateTestContext() |
|||
{ |
|||
var testContext = new TestContext(); |
|||
testContext.Services.AddFallbackServiceProvider(ServiceProvider); |
|||
foreach (var service in ServiceProvider.GetRequiredService<IAbpApplicationWithExternalServiceProvider>().Services) |
|||
{ |
|||
testContext.Services.Add(service); |
|||
} |
|||
testContext.Services.AddBlazorise().AddBootstrap5Providers().AddFontAwesomeIcons(); |
|||
return testContext; |
|||
} |
|||
} |
|||
``` |
|||
|
|||
Finally, we add an `Index_Tests` class to test the `Index` component. |
|||
|
|||
```cs |
|||
public class Index_Tests : BookStoreBlazorTestBase |
|||
{ |
|||
[Fact] |
|||
public void Index_Test() |
|||
{ |
|||
using (var ctx = CreateTestContext()) |
|||
{ |
|||
// Act |
|||
var cut = ctx.RenderComponent<BookStore.Blazor.Pages.Index>(); |
|||
|
|||
// Assert |
|||
cut.Find(".lead").InnerHtml.Contains("Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.").ShouldBeTrue(); |
|||
|
|||
cut.Find("#username").InnerHtml.Contains("Welcome admin").ShouldBeTrue(); |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## Reference document |
|||
|
|||
https://github.com/bUnit-dev/bUnit |
|||
|
|||
https://docs.microsoft.com/en-us/aspnet/core/blazor/test |
|||
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 38 KiB |
@ -0,0 +1,8 @@ |
|||
namespace Volo.Abp.Cli.ProjectModification.Events; |
|||
|
|||
public class ModuleInstallingProgressEvent |
|||
{ |
|||
public int CurrentStep { get; set; } |
|||
|
|||
public string Message { get; set; } |
|||
} |
|||
@ -0,0 +1,52 @@ |
|||
using System; |
|||
using System.Collections.Concurrent; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
|
|||
namespace Volo.Abp.EventBus; |
|||
|
|||
public class EventHandlerInvoker : IEventHandlerInvoker, ISingletonDependency |
|||
{ |
|||
private readonly ConcurrentDictionary<string, EventHandlerInvokerCacheItem> _cache; |
|||
|
|||
public EventHandlerInvoker() |
|||
{ |
|||
_cache = new ConcurrentDictionary<string, EventHandlerInvokerCacheItem>(); |
|||
} |
|||
|
|||
public async Task InvokeAsync(IEventHandler eventHandler, object eventData, Type eventType) |
|||
{ |
|||
var cacheItem = _cache.GetOrAdd($"{eventHandler.GetType().FullName}-{eventType.FullName}", _ => |
|||
{ |
|||
var item = new EventHandlerInvokerCacheItem(); |
|||
|
|||
if (typeof(ILocalEventHandler<>).MakeGenericType(eventType).IsInstanceOfType(eventHandler)) |
|||
{ |
|||
item.Local = (IEventHandlerMethodExecutor)Activator.CreateInstance(typeof(LocalEventHandlerMethodExecutor<>).MakeGenericType(eventType)); |
|||
} |
|||
|
|||
if (typeof(IDistributedEventHandler<>).MakeGenericType(eventType).IsInstanceOfType(eventHandler)) |
|||
{ |
|||
item.Distributed = (IEventHandlerMethodExecutor)Activator.CreateInstance(typeof(DistributedEventHandlerMethodExecutor<>).MakeGenericType(eventType)); |
|||
} |
|||
|
|||
return item; |
|||
}); |
|||
|
|||
if (cacheItem.Local != null) |
|||
{ |
|||
await cacheItem.Local.ExecutorAsync(eventHandler, eventData); |
|||
} |
|||
|
|||
if (cacheItem.Distributed != null) |
|||
{ |
|||
await cacheItem.Distributed.ExecutorAsync(eventHandler, eventData); |
|||
} |
|||
|
|||
if (cacheItem.Local == null && cacheItem.Distributed == null) |
|||
{ |
|||
throw new AbpException("The object instance is not an event handler. Object type: " + eventHandler.GetType().AssemblyQualifiedName); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
namespace Volo.Abp.EventBus; |
|||
|
|||
public class EventHandlerInvokerCacheItem |
|||
{ |
|||
public IEventHandlerMethodExecutor Local { get; set; } |
|||
|
|||
public IEventHandlerMethodExecutor Distributed { get; set; } |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
|
|||
namespace Volo.Abp.EventBus; |
|||
|
|||
public delegate Task EventHandlerMethodExecutorAsync(IEventHandler target, object parameter); |
|||
|
|||
public interface IEventHandlerMethodExecutor |
|||
{ |
|||
EventHandlerMethodExecutorAsync ExecutorAsync { get; } |
|||
} |
|||
|
|||
public class LocalEventHandlerMethodExecutor<TEvent> : IEventHandlerMethodExecutor |
|||
where TEvent : class |
|||
{ |
|||
public EventHandlerMethodExecutorAsync ExecutorAsync => (target, parameter) => target.As<ILocalEventHandler<TEvent>>().HandleEventAsync(parameter.As<TEvent>()); |
|||
|
|||
public Task ExecuteAsync(IEventHandler target, TEvent parameters) |
|||
{ |
|||
return ExecutorAsync(target, parameters); |
|||
} |
|||
} |
|||
|
|||
public class DistributedEventHandlerMethodExecutor<TEvent> : IEventHandlerMethodExecutor |
|||
where TEvent : class |
|||
{ |
|||
public EventHandlerMethodExecutorAsync ExecutorAsync => (target, parameter) => target.As<IDistributedEventHandler<TEvent>>().HandleEventAsync(parameter.As<TEvent>()); |
|||
|
|||
public Task ExecuteAsync(IEventHandler target, TEvent parameters) |
|||
{ |
|||
return ExecutorAsync(target, parameters); |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.EventBus; |
|||
|
|||
public interface IEventHandlerInvoker |
|||
{ |
|||
Task InvokeAsync(IEventHandler eventHandler, object eventData, Type eventType); |
|||
} |
|||
@ -0,0 +1,128 @@ |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Shouldly; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.Domain.Entities.Events; |
|||
using Volo.Abp.Domain.Entities.Events.Distributed; |
|||
using Volo.Abp.EventBus.Distributed; |
|||
using Volo.Abp.EventBus.Local; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.EventBus; |
|||
|
|||
public class EventHandlerInvoker_Tests : EventBusTestBase |
|||
{ |
|||
private readonly IEventHandlerInvoker _eventHandlerInvoker; |
|||
|
|||
public EventHandlerInvoker_Tests() |
|||
{ |
|||
_eventHandlerInvoker = GetRequiredService<IEventHandlerInvoker>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Invoke_LocalEventHandler_With_MyEventData() |
|||
{ |
|||
var localHandler = new MyLocalEventHandler(); |
|||
var eventData = new MyEventData(); |
|||
|
|||
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType()); |
|||
|
|||
localHandler.MyEventDataCount.ShouldBe(2); |
|||
localHandler.EntityChangedEventDataCount.ShouldBe(0); |
|||
localHandler.EntityChangedEventDataCount.ShouldBe(0); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Invoke_LocalEventHandler_Created_And_Changed_Once() |
|||
{ |
|||
var localHandler = new MyLocalEventHandler(); |
|||
var eventData = new EntityCreatedEventData<MyEntity>(new MyEntity()); |
|||
|
|||
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType()); |
|||
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, typeof(EntityChangedEventData<MyEntity>)); |
|||
|
|||
localHandler.MyEventDataCount.ShouldBe(0); |
|||
localHandler.EntityChangedEventDataCount.ShouldBe(1); |
|||
localHandler.EntityChangedEventDataCount.ShouldBe(1); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Invoke_DistributedEventHandler_With_MyEventData() |
|||
{ |
|||
var localHandler = new MyDistributedEventHandler(); |
|||
var eventData = new MyEventData(); |
|||
|
|||
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType()); |
|||
|
|||
localHandler.MyEventDataCount.ShouldBe(1); |
|||
localHandler.EntityCreatedCount.ShouldBe(0); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Invoke_DistributedEventHandler_With_EntityCreatedEto() |
|||
{ |
|||
var localHandler = new MyDistributedEventHandler(); |
|||
var eventData = new EntityCreatedEto<MyEntity>(new MyEntity()); |
|||
|
|||
await _eventHandlerInvoker.InvokeAsync(localHandler, eventData, eventData.GetType()); |
|||
|
|||
localHandler.MyEventDataCount.ShouldBe(0); |
|||
localHandler.EntityCreatedCount.ShouldBe(1); |
|||
} |
|||
|
|||
public class MyEventData |
|||
{ |
|||
} |
|||
|
|||
public class MyEntity : Entity<Guid> |
|||
{ |
|||
|
|||
} |
|||
|
|||
public class MyDistributedEventHandler : IDistributedEventHandler<MyEventData>, |
|||
IDistributedEventHandler<EntityCreatedEto<MyEntity>> |
|||
{ |
|||
public int MyEventDataCount { get; set; } |
|||
public int EntityCreatedCount { get; set; } |
|||
|
|||
public Task HandleEventAsync(MyEventData eventData) |
|||
{ |
|||
MyEventDataCount++; |
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
public Task HandleEventAsync(EntityCreatedEto<MyEntity> eventData) |
|||
{ |
|||
EntityCreatedCount++; |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
|
|||
public class MyLocalEventHandler : ILocalEventHandler<MyEventData>, |
|||
IDistributedEventHandler<MyEventData>, |
|||
IDistributedEventHandler<EntityCreatedEventData<MyEntity>>, |
|||
IDistributedEventHandler<EntityChangedEventData<MyEntity>> |
|||
{ |
|||
public int MyEventDataCount { get; set; } |
|||
public int EntityCreatedEventDataCount { get; set; } |
|||
public int EntityChangedEventDataCount { get; set; } |
|||
|
|||
public Task HandleEventAsync(MyEventData eventData) |
|||
{ |
|||
MyEventDataCount++; |
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
public Task HandleEventAsync(EntityCreatedEventData<MyEntity> eventData) |
|||
{ |
|||
EntityCreatedEventDataCount++; |
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
public Task HandleEventAsync(EntityChangedEventData<MyEntity> eventData) |
|||
{ |
|||
EntityChangedEventDataCount++; |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.Account.Application.Contracts", |
|||
"hash": "eda5b3412f7e1dd8dc07761a04f3a064", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.Account", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAccountApplicationContractsModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,49 @@ |
|||
{ |
|||
"name": "Volo.Abp.Account.Application", |
|||
"hash": "7fb9c3f35b18f2e9a0577d571fccf9df", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.Account", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAccountApplicationModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.Account", |
|||
"summary": null, |
|||
"implementingInterfaces": [ |
|||
"Volo.Abp.Account.IAccountAppService" |
|||
], |
|||
"contentType": "applicationService", |
|||
"name": "AccountAppService" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.Account", |
|||
"summary": null, |
|||
"implementingInterfaces": [ |
|||
"Volo.Abp.Account.IProfileAppService" |
|||
], |
|||
"contentType": "applicationService", |
|||
"name": "ProfileAppService" |
|||
}, |
|||
{ |
|||
"defaultValue": "true", |
|||
"displayName": "Is self-registration enabled", |
|||
"description": "Whether a user can register the account by him or herself.", |
|||
"isVisibleToClient": true, |
|||
"isInherited": true, |
|||
"isEncrypted": false, |
|||
"contentType": "setting", |
|||
"name": "Abp.Account.IsSelfRegistrationEnabled" |
|||
}, |
|||
{ |
|||
"defaultValue": "true", |
|||
"displayName": "Authenticate with a local account", |
|||
"description": "Indicates if the server will allow users to authenticate with a local account.", |
|||
"isVisibleToClient": true, |
|||
"isInherited": true, |
|||
"isEncrypted": false, |
|||
"contentType": "setting", |
|||
"name": "Abp.Account.EnableLocalLogin" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.Account.HttpApi.Client", |
|||
"hash": "ca67872e6cd8c25508461f7d171a8f04", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.Account", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAccountHttpApiClientModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.Account.HttpApi", |
|||
"hash": "b178895fe2a7f470f36c4fd121b7c07a", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.Account", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAccountHttpApiModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1 @@ |
|||
{} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.Account.Web", |
|||
"hash": "5fb2aa05261d4febe7ea7083d80fea74", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.Account.Web", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAccountWebModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.AuditLogging.Domain.Shared", |
|||
"hash": "91305b5b9fa1cd0a8a9adc6a0e54877b", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAuditLoggingDomainSharedModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
{ |
|||
"name": "Volo.Abp.AuditLogging.Domain", |
|||
"hash": "df19d27b7da103de2da1826c6ba8e161", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAuditLoggingDomainModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [ |
|||
"Volo.Abp.AuditLogging.EntityChange", |
|||
"Volo.Abp.AuditLogging.AuditLogAction" |
|||
], |
|||
"navigationProperties": [], |
|||
"contentType": "aggregateRoot", |
|||
"name": "AuditLog" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging", |
|||
"summary": null, |
|||
"entityModel": { |
|||
"namespace": "Volo.Abp.AuditLogging", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [ |
|||
"Volo.Abp.AuditLogging.EntityChange", |
|||
"Volo.Abp.AuditLogging.AuditLogAction" |
|||
], |
|||
"navigationProperties": [], |
|||
"contentType": "entity", |
|||
"name": "AuditLog" |
|||
}, |
|||
"contentType": "repositoryInterface", |
|||
"name": "IAuditLogRepository" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
{ |
|||
"name": "Volo.Abp.AuditLogging.EntityFrameworkCore", |
|||
"hash": "0495e8cfba68a55319b3774882939845", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging.EntityFrameworkCore", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAuditLoggingEntityFrameworkCoreModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging.EntityFrameworkCore", |
|||
"connectionStringName": "AbpAuditLogging", |
|||
"databaseTables": [ |
|||
{ |
|||
"entityFullName": "Volo.Abp.AuditLogging.AuditLog", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpAuditLogs" |
|||
}, |
|||
{ |
|||
"entityFullName": "Volo.Abp.AuditLogging.AuditLogAction", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpAuditLogActions" |
|||
}, |
|||
{ |
|||
"entityFullName": "Volo.Abp.AuditLogging.EntityChange", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpEntityChanges" |
|||
}, |
|||
{ |
|||
"entityFullName": "Volo.Abp.AuditLogging.EntityPropertyChange", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpEntityPropertyChanges" |
|||
} |
|||
], |
|||
"contentType": "efCoreDbContext", |
|||
"name": "AbpAuditLoggingDbContext" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1 @@ |
|||
{} |
|||
@ -0,0 +1,24 @@ |
|||
{ |
|||
"name": "Volo.Abp.AuditLogging.MongoDB", |
|||
"hash": "e87142d2a7e24741c98d02daa9005ac1", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging.MongoDB", |
|||
"contentType": "abpModule", |
|||
"name": "AbpAuditLoggingMongoDbModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.AuditLogging.MongoDB", |
|||
"connectionStringName": "AbpAuditLogging", |
|||
"databaseCollections": [ |
|||
{ |
|||
"entityFullName": "Volo.Abp.AuditLogging.AuditLog", |
|||
"contentType": "databaseCollection", |
|||
"name": "AbpAuditLogs" |
|||
} |
|||
], |
|||
"contentType": "mongoDbContext", |
|||
"name": "AuditLoggingMongoDbContext" |
|||
} |
|||
] |
|||
} |
|||
@ -1 +1,3 @@ |
|||
{} |
|||
{ |
|||
"role": "lib.test" |
|||
} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.BackgroundJobs.Domain.Shared", |
|||
"hash": "d48277ec610b23392edcb12ae3e29175", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs", |
|||
"contentType": "abpModule", |
|||
"name": "AbpBackgroundJobsDomainSharedModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
{ |
|||
"name": "Volo.Abp.BackgroundJobs.Domain", |
|||
"hash": "1398bbe3f228b2bfd0baec6a64c03b43", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs", |
|||
"contentType": "abpModule", |
|||
"name": "AbpBackgroundJobsDomainModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [], |
|||
"navigationProperties": [], |
|||
"contentType": "aggregateRoot", |
|||
"name": "BackgroundJobRecord" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs", |
|||
"summary": null, |
|||
"entityModel": { |
|||
"namespace": "Volo.Abp.BackgroundJobs", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [], |
|||
"navigationProperties": [], |
|||
"contentType": "entity", |
|||
"name": "BackgroundJobRecord" |
|||
}, |
|||
"contentType": "repositoryInterface", |
|||
"name": "IBackgroundJobRepository" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
{ |
|||
"name": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", |
|||
"hash": "f3bf7c7db2ab764d6421df0b88ea535b", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", |
|||
"contentType": "abpModule", |
|||
"name": "AbpBackgroundJobsEntityFrameworkCoreModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs.EntityFrameworkCore", |
|||
"connectionStringName": "AbpBackgroundJobs", |
|||
"databaseTables": [ |
|||
{ |
|||
"entityFullName": "Volo.Abp.BackgroundJobs.BackgroundJobRecord", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpBackgroundJobs" |
|||
} |
|||
], |
|||
"contentType": "efCoreDbContext", |
|||
"name": "BackgroundJobsDbContext" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1 @@ |
|||
{} |
|||
@ -0,0 +1,24 @@ |
|||
{ |
|||
"name": "Volo.Abp.BackgroundJobs.MongoDB", |
|||
"hash": "def047f007cc2f8c9a74459f1df01330", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs.MongoDB", |
|||
"contentType": "abpModule", |
|||
"name": "AbpBackgroundJobsMongoDbModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BackgroundJobs.MongoDB", |
|||
"connectionStringName": "AbpBackgroundJobs", |
|||
"databaseCollections": [ |
|||
{ |
|||
"entityFullName": "Volo.Abp.BackgroundJobs.BackgroundJobRecord", |
|||
"contentType": "databaseCollection", |
|||
"name": "AbpBackgroundJobs" |
|||
} |
|||
], |
|||
"contentType": "mongoDbContext", |
|||
"name": "BackgroundJobsMongoDbContext" |
|||
} |
|||
] |
|||
} |
|||
@ -1 +1,3 @@ |
|||
{} |
|||
{ |
|||
"role": "lib.test" |
|||
} |
|||
@ -0,0 +1 @@ |
|||
{} |
|||
@ -0,0 +1,11 @@ |
|||
{ |
|||
"name": "Volo.Abp.BlobStoring.Database.Domain.Shared", |
|||
"hash": "eed9ff456824aac8ba0fe73baa6cf288", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"contentType": "abpModule", |
|||
"name": "BlobStoringDatabaseDomainSharedModule" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,59 @@ |
|||
{ |
|||
"name": "Volo.Abp.BlobStoring.Database.Domain", |
|||
"hash": "744c78df1c9addf5e9f6657295f0529c", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"contentType": "abpModule", |
|||
"name": "BlobStoringDatabaseDomainModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [], |
|||
"navigationProperties": [], |
|||
"contentType": "aggregateRoot", |
|||
"name": "DatabaseBlob" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [], |
|||
"navigationProperties": [], |
|||
"contentType": "aggregateRoot", |
|||
"name": "DatabaseBlobContainer" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"summary": null, |
|||
"entityModel": { |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [], |
|||
"navigationProperties": [], |
|||
"contentType": "entity", |
|||
"name": "DatabaseBlobContainer" |
|||
}, |
|||
"contentType": "repositoryInterface", |
|||
"name": "IDatabaseBlobContainerRepository" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"summary": null, |
|||
"entityModel": { |
|||
"namespace": "Volo.Abp.BlobStoring.Database", |
|||
"primaryKeyType": "Guid", |
|||
"summary": null, |
|||
"collectionProperties": [], |
|||
"navigationProperties": [], |
|||
"contentType": "entity", |
|||
"name": "DatabaseBlob" |
|||
}, |
|||
"contentType": "repositoryInterface", |
|||
"name": "IDatabaseBlobRepository" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
{ |
|||
"name": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", |
|||
"hash": "91e3a724f35375f79d9505ca0e950b9e", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", |
|||
"contentType": "abpModule", |
|||
"name": "BlobStoringDatabaseEntityFrameworkCoreModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database.EntityFrameworkCore", |
|||
"connectionStringName": "AbpBlobStoring", |
|||
"databaseTables": [ |
|||
{ |
|||
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlob", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpBlobs" |
|||
}, |
|||
{ |
|||
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", |
|||
"contentType": "databaseTable", |
|||
"name": "AbpBlobContainers" |
|||
} |
|||
], |
|||
"contentType": "efCoreDbContext", |
|||
"name": "BlobStoringDbContext" |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1 @@ |
|||
{} |
|||
@ -0,0 +1,29 @@ |
|||
{ |
|||
"name": "Volo.Abp.BlobStoring.Database.MongoDB", |
|||
"hash": "4c911e5e8a2e8c4630d12f394a157819", |
|||
"contents": [ |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database.MongoDB", |
|||
"contentType": "abpModule", |
|||
"name": "BlobStoringDatabaseMongoDbModule" |
|||
}, |
|||
{ |
|||
"namespace": "Volo.Abp.BlobStoring.Database.MongoDB", |
|||
"connectionStringName": "AbpBlobStoring", |
|||
"databaseCollections": [ |
|||
{ |
|||
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlobContainer", |
|||
"contentType": "databaseCollection", |
|||
"name": "AbpBlobContainers" |
|||
}, |
|||
{ |
|||
"entityFullName": "Volo.Abp.BlobStoring.Database.DatabaseBlob", |
|||
"contentType": "databaseCollection", |
|||
"name": "AbpBlobs" |
|||
} |
|||
], |
|||
"contentType": "mongoDbContext", |
|||
"name": "BlobStoringMongoDbContext" |
|||
} |
|||
] |
|||
} |
|||