@ -1,25 +0,0 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|||
# Visual Studio Version 16 |
|||
VisualStudioVersion = 16.0.29009.5 |
|||
MinimumVisualStudioVersion = 10.0.40219.1 |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AbpIoLocalization", "AbpIoLocalization\AbpIoLocalization.csproj", "{35D94BAB-22DF-47E0-AB4A-99CB6495CF50}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|Any CPU = Debug|Any CPU |
|||
Release|Any CPU = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
GlobalSection(ExtensibilityGlobals) = postSolution |
|||
SolutionGuid = {2CF52C6D-D914-44A3-8F02-7E7BEA0644C5} |
|||
EndGlobalSection |
|||
EndGlobal |
|||
@ -0,0 +1,3 @@ |
|||
<Solution> |
|||
<Project Path="AbpIoLocalization/AbpIoLocalization.csproj" /> |
|||
</Solution> |
|||
@ -0,0 +1,192 @@ |
|||
# How Can We Apply the DRY Principle in a Better Way |
|||
|
|||
## Introduction |
|||
|
|||
In modern software development, the **DRY principle** - short for *Don't Repeat Yourself* - is one of the most important rules for writing clean and easy-to-maintain code. First introduced by Andrew Hunt and David Thomas in *The Pragmatic Programmer*, DRY focuses on removing repetition in code, documentation, and processes. The main idea is: *"Every piece of knowledge should exist in only one place in the system."* Even if this idea looks simple, using it in real projects - especially big ones - needs discipline, good planning, and the right tools. |
|||
|
|||
This article explains what the DRY principle is, why it matters, how we can use it in a better way, and how big projects can make it work. |
|||
|
|||
--- |
|||
|
|||
## What is the DRY Principle? |
|||
|
|||
The DRY principle is about reducing repetition. Repetition can happen in many forms: |
|||
|
|||
- **Code repetition:** Writing the same logic in different functions, classes, or modules. |
|||
|
|||
- **Business logic repetition:** Having the same business rules in different parts of the system. |
|||
|
|||
- **Configuration repetition:** Keeping multiple versions of the same settings or constants. |
|||
|
|||
- **Documentation repetition:** Copying the same explanations across files, which later become inconsistent. |
|||
|
|||
When teams follow DRY, each piece of knowledge exists only once, making the system easier to update and lowering the chance of mistakes. |
|||
|
|||
--- |
|||
|
|||
## Why is DRY Important? |
|||
|
|||
1. **Easy Maintenance** |
|||
If some logic changes, we only need to update it in one place instead of many places. |
|||
|
|||
2. **Consistency** |
|||
DRY helps avoid bugs caused by different versions of the same logic. |
|||
|
|||
3. **Better Growth** |
|||
DRY codebases are smaller and more modular, so they grow more easily. |
|||
|
|||
4. **Teamwork** |
|||
In large teams, DRY reduces confusion and makes it easier for everyone to understand the system. |
|||
|
|||
--- |
|||
|
|||
## Common Mistakes with DRY |
|||
|
|||
Sometimes developers use DRY in the wrong way. Trying too hard to remove repetition can create very complex code that is difficult to read. For example: |
|||
|
|||
- **Abstracting too early:** Generalizing code before real patterns appear can cause confusion. |
|||
|
|||
- **Over-engineering:** Building tools or frameworks for problems that only happen once. |
|||
|
|||
- **Too much connection:** Forcing different modules to share code when they should stay independent. |
|||
|
|||
The goal of DRY is not to remove *all* repetition, but to remove *meaningless repetition* that makes code harder to maintain. |
|||
|
|||
--- |
|||
|
|||
## How Can We Use DRY Better? |
|||
|
|||
### 1. Find Repetition Early |
|||
|
|||
Tools like **linters, static analyzers, and code reviews** help find repeated logic. Some tools can even automatically detect duplicate code. |
|||
|
|||
### 2. Create Reusable Components |
|||
|
|||
Instead of copying code, move shared logic into: |
|||
|
|||
- Functions or methods |
|||
|
|||
- Utility classes |
|||
|
|||
- Shared modules or libraries |
|||
|
|||
- Configuration files (for constants) |
|||
|
|||
**Example:** |
|||
|
|||
```python |
|||
# Not DRY |
|||
send_email_to_admin(subject, body) |
|||
send_email_to_user(subject, body) |
|||
|
|||
# DRY |
|||
send_email(recipient_type, subject, body) |
|||
``` |
|||
|
|||
### 3. Keep Documentation in One Place |
|||
|
|||
Do not copy the same documentation to many files. Use wikis, shared docs, or API tools that pull from one single source. |
|||
|
|||
### 4. Use Frameworks and Standards |
|||
|
|||
Frameworks like **Spring Boot, ASP.NET, or Django** give built-in ways to follow DRY, so developers don’t have to repeat the same patterns. |
|||
|
|||
### 5. Automate Tasks with High Repetition |
|||
|
|||
Instead of writing the same boilerplate code again and again, use: |
|||
|
|||
- Code generators |
|||
|
|||
- CI/CD pipelines |
|||
|
|||
- Infrastructure as Code (IaC) |
|||
|
|||
--- |
|||
|
|||
## Practical Steps to Apply DRY in Daily Work |
|||
|
|||
Applying DRY is not only about big design decisions; it is also about small habits in daily coding. Some practical steps include: |
|||
|
|||
- **Review before copy-paste:** When you feel the need to copy code, stop and ask if it can be moved to a shared method or module. |
|||
|
|||
- **Write helper functions:** If you see similar logic more than twice, create a helper function instead of repeating it. |
|||
|
|||
- **Use clear naming:** Good names for functions and variables make shared code easier to understand and reuse. |
|||
|
|||
- **Communicate with the team:** Before creating a new utility or feature, check if something similar already exists in the project. |
|||
|
|||
- **Refactor regularly:** Small refactors during development help keep code clean and reduce hidden repetition. |
|||
|
|||
These small actions in daily work make it easier to follow DRY naturally, without waiting for big rewrites. |
|||
|
|||
--- |
|||
|
|||
## DRY in Large Projects |
|||
|
|||
In big systems, DRY is harder but also more important. Large codebases often involve many developers working at the same time, which increases the chance of duplication. |
|||
|
|||
### How Big Teams Use DRY: |
|||
|
|||
1. **Modular Architectures** |
|||
Breaking applications into services, libraries, or packages helps to centralize shared functionality. |
|||
|
|||
2. **Shared Libraries and APIs** |
|||
Instead of rewriting logic, teams create internal libraries that act as the single source of truth. |
|||
|
|||
3. **Code Reviews and Pair Programming** |
|||
Developers check each other’s work to find repetition early. |
|||
|
|||
4. **Automated Tools** |
|||
Tools like **SonarQube, PMD, and ESLint** help detect duplicate code. |
|||
|
|||
5. **Clear Ownership** |
|||
Assigning owners for modules helps keep consistency and avoids duplication. |
|||
|
|||
--- |
|||
|
|||
## Example: DRY in a Large Project |
|||
|
|||
Imagine a large e-commerce platform with multiple teams: |
|||
|
|||
- **Team A** handles user authentication. |
|||
|
|||
- **Team B** handles orders. |
|||
|
|||
- **Team C** handles payments. |
|||
|
|||
Without DRY, both Team B and Team C might create their own email notification system. With DRY, they share a **Notification Service**: |
|||
|
|||
```csharp |
|||
// Shared Notification Service |
|||
public class NotificationService { |
|||
public void Send(string recipient, string subject, string message) { |
|||
// Unified logic for sending notifications |
|||
} |
|||
} |
|||
|
|||
// Usage in Orders Module |
|||
notificationService.Send(order.CustomerEmail, "Order Confirmed", "Your order has been placed."); |
|||
|
|||
// Usage in Payments Module |
|||
notificationService.Send(payment.CustomerEmail, "Payment Received", "Your payment was successful."); |
|||
``` |
|||
|
|||
This way, if the email format changes, only the **Notification Service** needs updating. |
|||
|
|||
--- |
|||
|
|||
## Conclusion |
|||
|
|||
The DRY principle is still one of the most important rules in modern software development. While the rule sounds simple - *don’t repeat yourself* - using it in the right way requires careful thinking. Wrong use of DRY can make things more complex, but correct use of DRY improves maintainability, growth, and teamwork. |
|||
|
|||
To use DRY better: |
|||
|
|||
- Focus on meaningful repetition. |
|||
|
|||
- Create reusable components. |
|||
|
|||
- Use frameworks, automation, and shared libraries. |
|||
|
|||
- Encourage teamwork and code reviews. |
|||
|
|||
In large projects, DRY works best with strong architecture, helpful tools, and discipline. If teams apply these practices, they can build cleaner, more maintainable, and scalable systems. |
|||
@ -0,0 +1,307 @@ |
|||
# Artificial Intelligence |
|||
|
|||
ABP provides a simple way to integrate AI capabilities into your applications by unifying two popular .NET AI stacks under a common concept called a "workspace": |
|||
|
|||
- Microsoft.Extensions.AI `IChatClient` |
|||
- Microsoft.SemanticKernel `Kernel` |
|||
|
|||
A workspace is just a named scope. You configure providers per workspace and then resolve either default services (for the "Default" workspace) or workspace-scoped services. |
|||
|
|||
## Installation |
|||
|
|||
> This package is not included by default. Install it to enable AI features. |
|||
|
|||
It is suggested to use the ABP CLI to install the package. Open a command line window in the folder of the project (.csproj file) and type the following command: |
|||
|
|||
```bash |
|||
abp add-package Volo.Abp.AI |
|||
``` |
|||
|
|||
### Manual Installation |
|||
|
|||
Add nuget package to your project: |
|||
|
|||
```bash |
|||
dotnet add package Volo.Abp.AI |
|||
``` |
|||
|
|||
Then add the module dependency to your module class: |
|||
|
|||
```csharp |
|||
using Volo.Abp.AI; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
[DependsOn(typeof(AbpAIModule))] |
|||
public class MyProjectModule : AbpModule |
|||
{ |
|||
} |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
### Chat Client |
|||
|
|||
#### Default configuration (quick start) |
|||
|
|||
Configure the default workspace to inject `IChatClient` directly. |
|||
|
|||
```csharp |
|||
using Microsoft.Extensions.AI; |
|||
using Microsoft.SemanticKernel; |
|||
using Volo.Abp.AI; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
public class MyProjectModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.PreConfigure<AbpAIOptions>(options => |
|||
{ |
|||
options.Workspaces.ConfigureDefault(configuration => |
|||
{ |
|||
configuration.ConfigureChatClient(chatClientConfiguration => |
|||
{ |
|||
chatClientConfiguration.Builder = new ChatClientBuilder( |
|||
sp => new OllamaApiClient("http://localhost:11434", "mistral") |
|||
); |
|||
}); |
|||
|
|||
// Chat client only in this quick start |
|||
}); |
|||
}); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
Once configured, inject the default chat client: |
|||
|
|||
```csharp |
|||
using Microsoft.Extensions.AI; |
|||
|
|||
public class MyService |
|||
{ |
|||
private readonly IChatClient _chatClient; // default chat client |
|||
|
|||
public MyService(IChatClient chatClient) |
|||
{ |
|||
_chatClient = chatClient; |
|||
} |
|||
} |
|||
``` |
|||
|
|||
#### Workspace configuration |
|||
|
|||
Workspaces allow multiple, isolated AI configurations. Define workspace types (optionally decorated with `WorkspaceNameAttribute`). If omitted, the type’s full name is used. |
|||
|
|||
```csharp |
|||
using Volo.Abp.AI; |
|||
|
|||
[WorkspaceName("GreetingAssistant")] |
|||
public class GreetingAssistant // ChatClient-only workspace |
|||
{ |
|||
} |
|||
``` |
|||
|
|||
Configure a ChatClient workspace: |
|||
|
|||
```csharp |
|||
public class MyProjectModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.PreConfigure<AbpAIOptions>(options => |
|||
{ |
|||
options.Workspaces.Configure<GreetingAssistant>(configuration => |
|||
{ |
|||
configuration.ConfigureChatClient(chatClientConfiguration => |
|||
{ |
|||
chatClientConfiguration.Builder = new ChatClientBuilder( |
|||
sp => new OllamaApiClient("http://localhost:11434", "mistral") |
|||
); |
|||
|
|||
chatClientConfiguration.BuilderConfigurers.Add(builder => |
|||
{ |
|||
// Anything you want to do with the builder: |
|||
// builder.UseFunctionInvocation().UseLogging(); // For example |
|||
}); |
|||
}); |
|||
}); |
|||
}); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
### Semantic Kernel |
|||
|
|||
#### Default configuration |
|||
|
|||
|
|||
```csharp |
|||
public class MyProjectModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.PreConfigure<AbpAIOptions>(options => |
|||
{ |
|||
options.Workspaces.ConfigureDefault(configuration => |
|||
{ |
|||
configuration.ConfigureKernel(kernelConfiguration => |
|||
{ |
|||
kernelConfiguration.Builder = Kernel.CreateBuilder() |
|||
.AddAzureOpenAIChatClient("...", "..."); |
|||
}); |
|||
// Note: Chat client is not configured here |
|||
}); |
|||
}); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
Once configured, inject the default kernel: |
|||
|
|||
```csharp |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.AI; |
|||
|
|||
public class MyService |
|||
{ |
|||
private readonly IKernelAccessor _kernelAccessor; |
|||
public MyService(IKernelAccessor kernelAccessor) |
|||
{ |
|||
_kernelAccessor = kernelAccessor; |
|||
} |
|||
|
|||
public async Task DoSomethingAsync() |
|||
{ |
|||
var kernel = _kernelAccessor.Kernel; // Kernel might be null if no workspace is configured. |
|||
|
|||
var result = await kernel.InvokeAsync(/*... */); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
#### Workspace configuration |
|||
|
|||
```csharp |
|||
public class MyProjectModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.PreConfigure<AbpAIOptions>(options => |
|||
{ |
|||
options.Workspaces.Configure<ContentPlanner>(configuration => |
|||
{ |
|||
configuration.ConfigureKernel(kernelConfiguration => |
|||
{ |
|||
kernelConfiguration.Builder = Kernel.CreateBuilder() |
|||
.AddOpenAIChatCompletion("...", "..."); |
|||
}); |
|||
}); |
|||
}); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
#### Workspace usage |
|||
|
|||
```csharp |
|||
using Microsoft.Extensions.AI; |
|||
using Volo.Abp.AI; |
|||
using Microsoft.SemanticKernel; |
|||
|
|||
public class PlanningService |
|||
{ |
|||
private readonly IKernelAccessor<ContentPlanner> _kernelAccessor; |
|||
private readonly IChatClient<ContentPlanner> _chatClient; // available even if only Kernel is configured |
|||
|
|||
public PlanningService( |
|||
IKernelAccessor<ContentPlanner> kernelAccessor, |
|||
IChatClient<ContentPlanner> chatClient) |
|||
{ |
|||
_kernelAccessor = kernelAccessor; |
|||
_chatClient = chatClient; |
|||
} |
|||
|
|||
public async Task<string> PlanAsync(string topic) |
|||
{ |
|||
var kernel = _kernelAccessor.Kernel; // Microsoft.SemanticKernel.Kernel |
|||
// Use Semantic Kernel APIs if needed... |
|||
|
|||
var response = await _chatClient.GetResponseAsync( |
|||
[new ChatMessage(ChatRole.User, $"Create a content plan for: {topic}")] |
|||
); |
|||
return response?.Message?.Text ?? string.Empty; |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## Options |
|||
|
|||
`AbpAIOptions` configuration pattern offers `ConfigureChatClient(...)` and `ConfigureKernel(...)` methods for configuration. These methods are defined in the `WorkspaceConfiguration` class. They are used to configure the `ChatClient` and `Kernel` respectively. |
|||
|
|||
`Builder` is set once and is used to build the `ChatClient` or `Kernel` instance. `BuilderConfigurers` is a list of actions that are applied to the `Builder` instance for incremental changes. These actions are executed in the order they are added. |
|||
|
|||
If a workspace configures only the Kernel, a chat client may still be exposed for that workspace through the Kernel’s service provider (when available). |
|||
|
|||
|
|||
## Advanced Usage and Customizations |
|||
|
|||
### Addding Your Own DelegatingChatClient |
|||
|
|||
If you want to build your own decorator, implement a `DelegatingChatClient` derivative and provide an extension method that adds it to the `ChatClientBuilder` using `builder.Use(...)`. |
|||
|
|||
Example sketch: |
|||
|
|||
```csharp |
|||
using Microsoft.Extensions.AI; |
|||
|
|||
public class SystemMessageChatClient : DelegatingChatClient |
|||
{ |
|||
public SystemMessageChatClient(IChatClient inner, string systemMessage) : base(inner) |
|||
{ |
|||
SystemMessage = systemMessage; |
|||
} |
|||
|
|||
public string SystemMessage { get; set; } |
|||
|
|||
public override Task<ChatResponse> GetResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions? options = null, CancellationToken cancellationToken = default) |
|||
{ |
|||
// Mutate messages/options as needed, then call base |
|||
return base.GetResponseAsync(messages, options, cancellationToken); |
|||
} |
|||
} |
|||
|
|||
public static class SystemMessageChatClientExtensions |
|||
{ |
|||
public static ChatClientBuilder UseSystemMessage(this ChatClientBuilder builder, string systemMessage) |
|||
{ |
|||
return builder.Use(client => new SystemMessageChatClient(client, systemMessage)); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
|
|||
```cs |
|||
chatClientConfiguration.BuilderConfigurers.Add(builder => |
|||
{ |
|||
builder.UseSystemMessage("You are a helpful assistant that greets users in a friendly manner with their names."); |
|||
}); |
|||
``` |
|||
|
|||
## Technical Anatomy |
|||
|
|||
- `AbpAIModule`: Wires up configured workspaces, registers keyed services and default services for the `"Default"` workspace. |
|||
- `AbpAIOptions`: Holds `Workspaces` and provides helper methods for internal keyed service naming. |
|||
- `WorkspaceConfigurationDictionary` and `WorkspaceConfiguration`: Configure per-workspace Chat Client and Kernel. |
|||
- `ChatClientConfiguration` and `KernelConfiguration`: Hold builders and a list of ordered builder configurers. |
|||
- `WorkspaceNameAttribute`: Names a workspace; falls back to the type’s full name if not specified. |
|||
- `IChatClient<TWorkspace>`: Typed chat client for a workspace. |
|||
- `IKernelAccessor<TWorkspace>`: Provides access to the workspace’s `Kernel` instance if configured. |
|||
- `AbpAIWorkspaceOptions`: Exposes `ConfiguredWorkspaceNames` for diagnostics. |
|||
|
|||
There are no database tables for this feature; it is a pure configuration and DI integration layer. |
|||
|
|||
## See Also |
|||
|
|||
- Microsoft.Extensions.AI (Chat Client) |
|||
- Microsoft Semantic Kernel |
|||
@ -0,0 +1,35 @@ |
|||
# BLOB Storing Memory Provider |
|||
|
|||
Memory Storage Provider is used to store BLOBs in the memory. This is mainly used for unit testing purposes. |
|||
|
|||
> Read the [BLOB Storing document](../blob-storing) to understand how to use the BLOB storing system. This document only covers how to configure containers to use the memory. |
|||
|
|||
## Installation |
|||
|
|||
Use the ABP CLI to add [Volo.Abp.BlobStoring.Memory](https://www.nuget.org/packages/Volo.Abp.BlobStoring.Memory) NuGet package to your project: |
|||
|
|||
* Install the [ABP CLI](../../../cli) if you haven't installed before. |
|||
* Open a command line (terminal) in the directory of the `.csproj` file you want to add the `Volo.Abp.BlobStoring.Memory` package. |
|||
* Run `abp add-package Volo.Abp.BlobStoring.Memory` command. |
|||
|
|||
If you want to do it manually, install the [Volo.Abp.BlobStoring.Memory](https://www.nuget.org/packages/Volo.Abp.BlobStoring.Memory) NuGet package to your project and add `[DependsOn(typeof(AbpBlobStoringMemoryModule))]` to the [ABP module](../../architecture/modularity/basics.md) class inside your project. |
|||
|
|||
## Configuration |
|||
|
|||
Configuration is done in the `ConfigureServices` method of your [module](../../architecture/modularity/basics.md) class, as explained in the [BLOB Storing document](../blob-storing). |
|||
|
|||
**Example: Configure to use the Memory storage provider by default** |
|||
|
|||
````csharp |
|||
Configure<AbpBlobStoringOptions>(options => |
|||
{ |
|||
options.Containers.ConfigureDefault(container => |
|||
{ |
|||
container.UseMemory(); |
|||
}); |
|||
}); |
|||
```` |
|||
|
|||
`UseMemory` extension method is used to set the Memory Provider for a container. |
|||
|
|||
> See the [BLOB Storing document](../blob-storing) to learn how to configure this provider for a specific container. |
|||
@ -0,0 +1,127 @@ |
|||
# Setting Up Android Emulator Without Android Studio (Windows, macOS, Linux) |
|||
|
|||
This guide explains how to install and run an Android emulator **without Android Studio**, using only **Command Line Tools**. |
|||
|
|||
--- |
|||
|
|||
## 1. Download Required Tools |
|||
|
|||
Go to: [https://developer.android.com/studio#command-tools](https://developer.android.com/studio#command-tools) |
|||
Download the "Command line tools only" package for your OS: |
|||
|
|||
- **Windows:** `commandlinetools-win-*.zip` |
|||
- **macOS:** `commandlinetools-mac-*.zip` |
|||
- **Linux:** `commandlinetools-linux-*.zip` |
|||
|
|||
--- |
|||
|
|||
## 2. Create the Required Directory Structure |
|||
|
|||
### Windows: |
|||
``` |
|||
C:\Android\ |
|||
└── cmdline-tools\ |
|||
└── latest\ |
|||
└── [extract all files from the zip here] |
|||
``` |
|||
|
|||
### macOS / Linux: |
|||
``` |
|||
~/Android/ |
|||
└── cmdline-tools/ |
|||
└── latest/ |
|||
└── [extract all files from the zip here] |
|||
``` |
|||
|
|||
> You need to create the `latest` folder manually. |
|||
|
|||
--- |
|||
|
|||
## 3. Set Environment Variables |
|||
|
|||
### Windows (temporary for CMD session): |
|||
```cmd |
|||
set PATH=C:\Android\cmdline-tools\latest\bin;C:\Android\platform-tools;C:\Android\emulator;%PATH% |
|||
``` |
|||
|
|||
### macOS / Linux: |
|||
Add the following to your `.bashrc`, `.zshrc`, or `.bash_profile` file: |
|||
|
|||
```bash |
|||
export ANDROID_HOME=$HOME/Android |
|||
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin |
|||
export PATH=$PATH:$ANDROID_HOME/platform-tools |
|||
export PATH=$PATH:$ANDROID_HOME/emulator |
|||
``` |
|||
|
|||
> Apply the changes: |
|||
```bash |
|||
source ~/.zshrc # or ~/.bashrc if you're using bash |
|||
``` |
|||
|
|||
--- |
|||
|
|||
## 4. Install SDK Components |
|||
|
|||
Install platform tools, emulator, and a system image: |
|||
|
|||
```bash |
|||
sdkmanager --sdk_root=$ANDROID_HOME "platform-tools" "platforms;android-34" "system-images;android-34;google_apis;x86_64" "emulator" |
|||
``` |
|||
|
|||
> On Windows, replace `$ANDROID_HOME` with `--sdk_root=C:\Android`. |
|||
|
|||
--- |
|||
|
|||
## 5. Create an AVD (Android Virtual Device) |
|||
|
|||
### List available devices: |
|||
```bash |
|||
avdmanager list devices |
|||
``` |
|||
|
|||
### Create your AVD: |
|||
```bash |
|||
avdmanager create avd -n myEmu -k "system-images;android-34;google_apis;x86_64" --device "pixel" |
|||
``` |
|||
|
|||
--- |
|||
|
|||
## 6. Start the Emulator |
|||
|
|||
```bash |
|||
emulator -avd myEmu |
|||
``` |
|||
|
|||
The emulator window should open |
|||
|
|||
--- |
|||
|
|||
## Extra Tools and Commands |
|||
|
|||
### List connected devices with ADB: |
|||
```bash |
|||
adb devices |
|||
``` |
|||
|
|||
### Install an APK: |
|||
```bash |
|||
adb install myApp.apk |
|||
``` |
|||
|
|||
--- |
|||
|
|||
## Troubleshooting |
|||
|
|||
| Problem | Explanation | |
|||
|--------|-------------| |
|||
| `sdkmanager not found` | Make sure `PATH` includes the `latest/bin` directory | |
|||
| `x86_64 system image not found` | Make sure you've downloaded it using `sdkmanager` | |
|||
| `emulator not found` | Add the `emulator` directory to `PATH` | |
|||
| `setx` truncates path (Windows) | Use GUI to update environment variables manually | |
|||
|
|||
--- |
|||
|
|||
## Summary |
|||
|
|||
You can now run an Android emulator without installing Android Studio, entirely through the command line. This emulator can be used for React Native or any mobile development framework. |
|||
|
Before Width: | Height: | Size: 2.1 MiB After Width: | Height: | Size: 5.4 MiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 948 KiB After Width: | Height: | Size: 4.9 MiB |
|
After Width: | Height: | Size: 177 KiB |
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 682 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 664 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 669 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 98 KiB |
@ -0,0 +1,86 @@ |
|||
# ABP Version 10.0 Migration Guide |
|||
|
|||
This document is a guide for upgrading ABP v9.x solutions to ABP v10.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. |
|||
|
|||
## Open-Source (Framework) |
|||
|
|||
### Upgraded to .NET 10.0 |
|||
|
|||
We've upgraded ABP to .NET 10.0, so you need to move your solutions to .NET 10.0 if you want to use ABP 10.0. You can check Microsoft’s [Migrate from ASP.NET Core 9.0 to 10.0](https://learn.microsoft.com/en-us/aspnet/core/migration/90-to-100) documentation, to see how to update an existing ASP.NET Core 9.0 project to ASP.NET Core 10.0. |
|||
|
|||
### Razor Runtime Compilation Obsolete |
|||
|
|||
We removed the Razor Runtime Compilation support. |
|||
|
|||
For more information, you can check the [Razor Runtime Compilation Obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/razor-runtime-compilation-obsolete) page. |
|||
|
|||
### IActionContextAccessor Obsolete |
|||
|
|||
We removed the `IActionContextAccessor` from dependency injection. |
|||
|
|||
> We are not using `IActionContextAccessor` in ABP core framework and modules. |
|||
|
|||
See [IActionContextAccessor Obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/iactioncontextaccessor-obsolete) for more information. |
|||
|
|||
### Add `BLOB Storing Memory Provider` module. |
|||
|
|||
In this version, we added the `BLOB Storing Memory Provider` module for unit testing purposes. |
|||
|
|||
See the [BLOB Storing Memory Provider](https://github.com/abpframework/abp/blob/dev/docs/en/framework/infrastructure/blob-storing/memory.md) document for more information. |
|||
|
|||
### Always use `MapStaticAssets` |
|||
|
|||
Provious, the `MapStaticAssets` has performance problems if there are too many static files. and we will use `StaticFileMiddleware` to serve the static files in development mode. NET 10.0 has fixed this problem. We will always use `MapStaticAssets` to serve the static files. |
|||
|
|||
See [Static file serving performance issues](https://github.com/dotnet/aspnetcore/issues/59673) for more information. |
|||
|
|||
### C# 14 overload resolution with span parameters |
|||
|
|||
NET Core will redirect `array.Contains` extension method to `MemoryExtensions.Contains`, This will cause `MongoDB.Driver` to be unable to translate `IQueryable<T>`, If you are using `array.Contains` in your code, you should use following code to avoid this problem. |
|||
|
|||
> Only array has this problem, other types are not affected. eg List<T>, HashSet<T>, etc. |
|||
|
|||
> MongoDB.Driver will be fixed in the future. |
|||
|
|||
```csharp |
|||
M((array, num) => array.Contains(num)); // fails, binds to MemoryExtensions.Contains |
|||
M((array, num) => ((IEnumerable<int>)array).Contains(num)); // ok, binds to Enumerable.Contains |
|||
M((array, num) => array.AsEnumerable().Contains(num)); // ok, binds to Enumerable.Contains |
|||
M((array, num) => Enumerable.Contains(array, num)); // ok, binds to Enumerable.Contains |
|||
``` |
|||
|
|||
See the [C# 14 overload resolution with span parameters](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/csharp-overload-resolution#recommended-action) for more information. |
|||
|
|||
### OpenIddict 7.X |
|||
|
|||
We upgraded OpenIddict to 7.X. See the [OpenIddict 6.x to 7.x Migration Guide](https://documentation.openiddict.com/guides/migration/60-to-70.html) for more information. |
|||
|
|||
OpenIddict 7.X changed the `OpenIddictToken` entity, you must create a new database migration if you use Entity Framework Core. |
|||
|
|||
### Migrating from AutoMapper to Mapperly |
|||
|
|||
The AutoMapper library is no longer free for commercial use. For more details, you can refer to this [announcement post](https://www.jimmybogard.com/automapper-and-mediatr-going-commercial/). |
|||
|
|||
In this version, all ABP modules use Mapperly instead of AutoMapper. ABP Framework provides both AutoMapper and Mapperly integrations. If your project currently uses AutoMapper and you don't have a commercial license, you can follow the [Migrating from AutoMapper to Mapperly](https://github.com/abpframework/abp/blob/dev/docs/en/release-info/migration-guides/AutoMapper-To-Mapperly.md) document to migrate to Mapperly. |
|||
|
|||
### Failure Retry Policy for InboxProcessor |
|||
|
|||
We added a failure retry policy to `AbpEventBusBoxesOptions` (see `InboxProcessorFailurePolicy` and `InboxProcessorRetryBackoffFactor`). Because this change adds and removes fields in the `IncomingEventRecord` entity, you must create a new database migration if you use Inbox/Outbox with Entity Framework Core. |
|||
|
|||
* `InboxProcessorFailurePolicy`: The policy to handle the failure of the inbox processor. Default value is `Retry`. Possible values are: |
|||
* `Retry`: The current exception and subsequent events will continue to be processed in order in the next cycle. |
|||
* `RetryLater`: Skip the event that caused the exception and continue with the following events. The failed event will be retried after a delay that doubles with each retry, starting from the configured `InboxProcessorRetryBackoffFactor` (e.g., 10, 20, 40, 80 seconds). The default maximum retry count is 10 (configurable). Discard the event if it still fails after reaching the maximum retry count. |
|||
* `Discard`: The event that caused the exception will be discarded and will not be retried. |
|||
* `InboxProcessorRetryBackoffFactor`: The initial retry delay factor (double) used when `InboxProcessorFailurePolicy` is `RetryLater`. The retry delay is calculated as: `delay = InboxProcessorRetryBackoffFactor × 2^retryCount`. Default value is `10`. |
|||
|
|||
See the [Add failure retry policy to InboxProcessor](https://github.com/abpframework/abp/pull/23563) PR for more information. |
|||
|
|||
### Disable Cache Error Hiding in Development Environment |
|||
|
|||
Starting from **ABP 10.0**, the [`HideErrors`](../../framework/fundamentals/caching#Available-Options) option of `AbpDistributedCacheOptions` is **disabled by default in the development environment**. |
|||
|
|||
By default, ABP hides and logs cache server errors to keep the application running even when the cache is unavailable. |
|||
However, in the **development environment**, errors are no longer hidden so that developers can immediately detect and fix **any cache server issues** (such as connection, configuration, or runtime errors). |
|||
|
|||
## PRO |
|||
|
|||
@ -0,0 +1,255 @@ |
|||
<Solution> |
|||
<Folder Name="/src/"> |
|||
<Project Path="src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Abstractions/Volo.Abp.AspNetCore.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Bundling/Volo.Abp.AspNetCore.Bundling.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling/Volo.Abp.AspNetCore.Components.MauiBlazor.Bundling.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.Bundling/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.Bundling.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.MauiBlazor/Volo.Abp.AspNetCore.Components.MauiBlazor.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.Server.Theming/Volo.Abp.AspNetCore.Components.Server.Theming.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.Server/Volo.Abp.AspNetCore.Components.Server.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.Web.Theming/Volo.Abp.AspNetCore.Components.Web.Theming.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.Web/Volo.Abp.AspNetCore.Components.Web.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.WebAssembly.Theming/Volo.Abp.AspNetCore.Components.WebAssembly.Theming.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.MultiTenancy/Volo.Abp.AspNetCore.MultiTenancy.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo.Abp.AspNetCore.Mvc.Client.Common.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.Client/Volo.Abp.AspNetCore.Mvc.Client.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo.Abp.AspNetCore.Mvc.Contracts.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus/Volo.Abp.AspNetCore.Mvc.Dapr.EventBus.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.Dapr/Volo.Abp.AspNetCore.Mvc.Dapr.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson/Volo.Abp.AspNetCore.Mvc.NewtonsoftJson.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo.Abp.AspNetCore.Mvc.UI.Bundling.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo.Abp.AspNetCore.Mvc.UI.Packages.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo.Abp.AspNetCore.Mvc.UI.Widgets.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.Serilog/Volo.Abp.AspNetCore.Serilog.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.SignalR/Volo.Abp.AspNetCore.SignalR.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj" /> |
|||
<Project Path="src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj" /> |
|||
<Project Path="src/Volo.Abp.Auditing.Contracts/Volo.Abp.Auditing.Contracts.csproj" /> |
|||
<Project Path="src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj" /> |
|||
<Project Path="src/Volo.Abp.Authorization.Abstractions/Volo.Abp.Authorization.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj" /> |
|||
<Project Path="src/Volo.Abp.Autofac.WebAssembly/Volo.Abp.Autofac.WebAssembly.csproj" /> |
|||
<Project Path="src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj" /> |
|||
<Project Path="src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj" /> |
|||
<Project Path="src/Volo.Abp.AzureServiceBus/Volo.Abp.AzureServiceBus.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundJobs.Abstractions/Volo.Abp.BackgroundJobs.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundJobs.Quartz/Volo.Abp.BackgroundJobs.Quartz.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo.Abp.BackgroundJobs.RabbitMQ.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundJobs/Volo.Abp.BackgroundJobs.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundWorkers.Hangfire/Volo.Abp.BackgroundWorkers.Hangfire.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundWorkers.Quartz/Volo.Abp.BackgroundWorkers.Quartz.csproj" /> |
|||
<Project Path="src/Volo.Abp.BackgroundWorkers/Volo.Abp.BackgroundWorkers.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Bunny/Volo.Abp.BlobStoring.Bunny.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.FileSystem/Volo.Abp.BlobStoring.FileSystem.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Google/Volo.Abp.BlobStoring.Google.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Memory/Volo.Abp.BlobStoring.Memory.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj" /> |
|||
<Project Path="src/Volo.Abp.BlobStoring/Volo.Abp.BlobStoring.csproj" /> |
|||
<Project Path="src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj" /> |
|||
<Project Path="src/Volo.Abp.Caching/Volo.Abp.Caching.csproj" /> |
|||
<Project Path="src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj" /> |
|||
<Project Path="src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj" /> |
|||
<Project Path="src/Volo.Abp.Cli/Volo.Abp.Cli.csproj" /> |
|||
<Project Path="src/Volo.Abp.Core/Volo.Abp.Core.csproj" /> |
|||
<Project Path="src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj" /> |
|||
<Project Path="src/Volo.Abp.Dapr/Volo.Abp.Dapr.csproj" /> |
|||
<Project Path="src/Volo.Abp.Data/Volo.Abp.Data.csproj" /> |
|||
<Project Path="src/Volo.Abp.Ddd.Application.Contracts/Volo.Abp.Ddd.Application.Contracts.csproj" /> |
|||
<Project Path="src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj" /> |
|||
<Project Path="src/Volo.Abp.Ddd.Domain.Shared/Volo.Abp.Ddd.Domain.Shared.csproj" /> |
|||
<Project Path="src/Volo.Abp.Ddd.Domain/Volo.Abp.Ddd.Domain.csproj" /> |
|||
<Project Path="src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.DistributedLocking.Dapr/Volo.Abp.DistributedLocking.Dapr.csproj" /> |
|||
<Project Path="src/Volo.Abp.DistributedLocking/Volo.Abp.DistributedLocking.csproj" /> |
|||
<Project Path="src/Volo.Abp.Emailing/Volo.Abp.Emailing.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo/Volo.Abp.EntityFrameworkCore.MySQL.Pomelo.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.Oracle.Devart/Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.Oracle/Volo.Abp.EntityFrameworkCore.Oracle.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj" /> |
|||
<Project Path="src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus.Abstractions/Volo.Abp.EventBus.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus.Azure/Volo.Abp.EventBus.Azure.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus.Dapr/Volo.Abp.EventBus.Dapr.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus.Kafka/Volo.Abp.EventBus.Kafka.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus.RabbitMQ/Volo.Abp.EventBus.RabbitMQ.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus.Rebus/Volo.Abp.EventBus.Rebus.csproj" /> |
|||
<Project Path="src/Volo.Abp.EventBus/Volo.Abp.EventBus.csproj" /> |
|||
<Project Path="src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj" /> |
|||
<Project Path="src/Volo.Abp.Features/Volo.Abp.Features.csproj" /> |
|||
<Project Path="src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj" /> |
|||
<Project Path="src/Volo.Abp.Gdpr.Abstractions/Volo.Abp.Gdpr.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.GlobalFeatures/Volo.Abp.GlobalFeatures.csproj" /> |
|||
<Project Path="src/Volo.Abp.Guids/Volo.Abp.Guids.csproj" /> |
|||
<Project Path="src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Abstractions/Volo.Abp.Http.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client.Dapr/Volo.Abp.Http.Client.Dapr.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client.IdentityModel.MauiBlazor/Volo.Abp.Http.Client.IdentityModel.MauiBlazor.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client.IdentityModel/Volo.Abp.Http.Client.IdentityModel.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client.Web/Volo.Abp.Http.Client.Web.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj" /> |
|||
<Project Path="src/Volo.Abp.Http/Volo.Abp.Http.csproj" /> |
|||
<Project Path="src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj" /> |
|||
<Project Path="src/Volo.Abp.Imaging.Abstractions/Volo.Abp.Imaging.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Imaging.AspNetCore/Volo.Abp.Imaging.AspNetCore.csproj" /> |
|||
<Project Path="src/Volo.Abp.Imaging.ImageSharp/Volo.Abp.Imaging.ImageSharp.csproj" /> |
|||
<Project Path="src/Volo.Abp.Imaging.MagickNet/Volo.Abp.Imaging.MagickNet.csproj" /> |
|||
<Project Path="src/Volo.Abp.Imaging.SkiaSharp/Volo.Abp.Imaging.SkiaSharp.csproj" /> |
|||
<Project Path="src/Volo.Abp.Json.Abstractions/Volo.Abp.Json.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Json.Newtonsoft/Volo.Abp.Json.Newtonsoft.csproj" /> |
|||
<Project Path="src/Volo.Abp.Json.SystemTextJson/Volo.Abp.Json.SystemTextJson.csproj" /> |
|||
<Project Path="src/Volo.Abp.Json/Volo.Abp.Json.csproj" /> |
|||
<Project Path="src/Volo.Abp.Kafka/Volo.Abp.Kafka.csproj" /> |
|||
<Project Path="src/Volo.Abp.Ldap.Abstractions/Volo.Abp.Ldap.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Ldap/Volo.Abp.Ldap.csproj" /> |
|||
<Project Path="src/Volo.Abp.Localization.Abstractions/Volo.Abp.Localization.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Localization/Volo.Abp.Localization.csproj" /> |
|||
<Project Path="src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj" /> |
|||
<Project Path="src/Volo.Abp.Mapperly/Volo.Abp.Mapperly.csproj" /> |
|||
<Project Path="src/Volo.Abp.Maui.Client/Volo.Abp.Maui.Client.csproj" /> |
|||
<Project Path="src/Volo.Abp.MemoryDb/Volo.Abp.MemoryDb.csproj" /> |
|||
<Project Path="src/Volo.Abp.Minify/Volo.Abp.Minify.csproj" /> |
|||
<Project Path="src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj" /> |
|||
<Project Path="src/Volo.Abp.MultiLingualObjects/Volo.Abp.MultiLingualObjects.csproj" /> |
|||
<Project Path="src/Volo.Abp.MultiTenancy.Abstractions/Volo.Abp.MultiTenancy.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.MultiTenancy/Volo.Abp.MultiTenancy.csproj" /> |
|||
<Project Path="src/Volo.Abp.ObjectExtending/Volo.Abp.ObjectExtending.csproj" /> |
|||
<Project Path="src/Volo.Abp.ObjectMapping/Volo.Abp.ObjectMapping.csproj" /> |
|||
<Project Path="src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj" /> |
|||
<Project Path="src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj" /> |
|||
<Project Path="src/Volo.Abp.RemoteServices/Volo.Abp.RemoteServices.csproj" /> |
|||
<Project Path="src/Volo.Abp.Security/Volo.Abp.Security.csproj" /> |
|||
<Project Path="src/Volo.Abp.Serialization/Volo.Abp.Serialization.csproj" /> |
|||
<Project Path="src/Volo.Abp.Settings/Volo.Abp.Settings.csproj" /> |
|||
<Project Path="src/Volo.Abp.Sms.Aliyun/Volo.Abp.Sms.Aliyun.csproj" /> |
|||
<Project Path="src/Volo.Abp.Sms.TencentCloud/Volo.Abp.Sms.TencentCloud.csproj" /> |
|||
<Project Path="src/Volo.Abp.Sms/Volo.Abp.Sms.csproj" /> |
|||
<Project Path="src/Volo.Abp.Specifications/Volo.Abp.Specifications.csproj" /> |
|||
<Project Path="src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj" /> |
|||
<Project Path="src/Volo.Abp.TestBase/Volo.Abp.TestBase.csproj" /> |
|||
<Project Path="src/Volo.Abp.TextTemplating.Core/Volo.Abp.TextTemplating.Core.csproj" /> |
|||
<Project Path="src/Volo.Abp.TextTemplating.Razor/Volo.Abp.TextTemplating.Razor.csproj" /> |
|||
<Project Path="src/Volo.Abp.TextTemplating.Scriban/Volo.Abp.TextTemplating.Scriban.csproj" /> |
|||
<Project Path="src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj" /> |
|||
<Project Path="src/Volo.Abp.Threading/Volo.Abp.Threading.csproj" /> |
|||
<Project Path="src/Volo.Abp.Timing/Volo.Abp.Timing.csproj" /> |
|||
<Project Path="src/Volo.Abp.UI.Navigation/Volo.Abp.UI.Navigation.csproj" /> |
|||
<Project Path="src/Volo.Abp.UI/Volo.Abp.UI.csproj" /> |
|||
<Project Path="src/Volo.Abp.Uow/Volo.Abp.Uow.csproj" /> |
|||
<Project Path="src/Volo.Abp.Validation.Abstractions/Volo.Abp.Validation.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.Validation/Volo.Abp.Validation.csproj" /> |
|||
<Project Path="src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj" /> |
|||
<Project Path="src/Volo.Abp/Volo.Abp.csproj" /> |
|||
<Project Path="src/Volo.Abp.AI.Abstractions/Volo.Abp.AI.Abstractions.csproj" /> |
|||
<Project Path="src/Volo.Abp.AI/Volo.Abp.AI.csproj" /> |
|||
</Folder> |
|||
<Folder Name="/test/"> |
|||
<Project Path="test/AbpTestBase/AbpTestBase.csproj" /> |
|||
<Project Path="test/SimpleConsoleDemo/SimpleConsoleDemo.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Bunny.Tests/Volo.Abp.BlobStoring.Bunny.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Google.Tests/Volo.Abp.BlobStoring.Google.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Memory.Tests/Volo.Abp.BlobStoring.Memory.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.DistributedLocking.Abstractions.Tests/Volo.Abp.DistributedLocking.Abstractions.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.EntityFrameworkCore.Tests.SecondContext/Volo.Abp.EntityFrameworkCore.Tests.SecondContext.csproj" /> |
|||
<Project Path="test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.ExceptionHandling.Tests/Volo.Abp.ExceptionHandling.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.IdentityModel.Tests/Volo.Abp.IdentityModel.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Imaging.Abstractions.Tests/Volo.Abp.Imaging.Abstractions.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Imaging.AspNetCore.Tests/Volo.Abp.Imaging.AspNetCore.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Imaging.ImageSharp.Tests/Volo.Abp.Imaging.ImageSharp.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Imaging.MagickNet.Tests/Volo.Abp.Imaging.MagickNet.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Imaging.SkiaSharp.Tests/Volo.Abp.Imaging.SkiaSharp.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Mapperly.Tests/Volo.Abp.Mapperly.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.MongoDB.Tests.SecondContext/Volo.Abp.MongoDB.Tests.SecondContext.csproj" /> |
|||
<Project Path="test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.MultiLingualObjects.Tests/Volo.Abp.MultiLingualObjects.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.RemoteServices.Tests/Volo.Abp.RemoteServices.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Sms.Aliyun.Tests/Volo.Abp.Sms.Aliyun.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Sms.TencenCloud.Tests/Volo.Abp.Sms.TencentCloud.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj" /> |
|||
<Project Path="test/Volo.Abp.TextTemplating.Razor.Tests/Volo.Abp.TextTemplating.Razor.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.TextTemplating.Scriban.Tests/Volo.Abp.TextTemplating.Scriban.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Threading.Tests/Volo.Abp.Threading.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Timing.Tests/Volo.Abp.Timing.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj" /> |
|||
<Project Path="test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj" /> |
|||
</Folder> |
|||
</Solution> |
|||
@ -0,0 +1,3 @@ |
|||
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> |
|||
<ConfigureAwait ContinueOnCapturedContext="false" /> |
|||
</Weavers> |
|||
@ -0,0 +1,30 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> |
|||
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. --> |
|||
<xs:element name="Weavers"> |
|||
<xs:complexType> |
|||
<xs:all> |
|||
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1"> |
|||
<xs:complexType> |
|||
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" /> |
|||
</xs:complexType> |
|||
</xs:element> |
|||
</xs:all> |
|||
<xs:attribute name="VerifyAssembly" type="xs:boolean"> |
|||
<xs:annotation> |
|||
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation> |
|||
</xs:annotation> |
|||
</xs:attribute> |
|||
<xs:attribute name="VerifyIgnoreCodes" type="xs:string"> |
|||
<xs:annotation> |
|||
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation> |
|||
</xs:annotation> |
|||
</xs:attribute> |
|||
<xs:attribute name="GenerateXsd" type="xs:boolean"> |
|||
<xs:annotation> |
|||
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation> |
|||
</xs:annotation> |
|||
</xs:attribute> |
|||
</xs:complexType> |
|||
</xs:element> |
|||
</xs:schema> |
|||
@ -0,0 +1,3 @@ |
|||
{ |
|||
"role": "lib.framework" |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\..\configureawait.props" /> |
|||
<Import Project="..\..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks> |
|||
<Nullable>enable</Nullable> |
|||
<WarningsAsErrors>Nullable</WarningsAsErrors> |
|||
<PackageId>Volo.Abp.AI.Abstractions</PackageId> |
|||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> |
|||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> |
|||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> |
|||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.SemanticKernel.Abstractions" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,7 @@ |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace Volo.Abp.AI; |
|||
|
|||
public class AbpAIAbstractionsModule : AbpModule |
|||
{ |
|||
} |
|||