@ -105,3 +105,7 @@ ABP is a community-driven open source project. See [the contribution guide](http
## Support the ABP Framework
Love ABP Framework? **Please give a star** to this repository :star:
## ABP Commercial
See also [ABP Commercial](https://commercial.abp.io/) if you are looking for pre-built application modules, professional themes, code generation tooling and premium support for the ABP Framework.
"UnsubscribeLicenseExpirationEmailSuccessMessage":"You will not receive license expiration date reminder emails anymore."
}
"UnsubscribeLicenseExpirationEmailSuccessMessage":"You will not receive license expiration date reminder emails anymore.",
"IndexPageHeroSection":"<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription":"ABP Commercial provides pre-built application modules, rapid application development tooling, professional UI themes, premium support and more.",
"LiveDemo":"Live Demo",
"GetLicence":"Get a Licence",
"Application":"Application",
"StartupTemplates":"Startup Templates",
"Startup":"Startup",
"Templates":"Templates",
"Developer":"Developer",
"Tools":"Tools",
"Premium":"Premium",
"PremiumSupport":"Premium Support",
"PremiumForumSupport":"Premium Forum Support",
"UI":"UI",
"Themes":"Themes",
"JoinOurNewsletter":"Join Our Newsletter",
"Send":"Send",
"Learn":"Learn",
"AdditionalServices":"Additional Services",
"WhatIsABPFramework":"WHAT IS THE ABP FRAMEWORK?",
"OpenSourceBaseFramework":"Open Source Base Framework",
"ABPFrameworkExplanation":"<p class=\"lead\">ABP Commercial is based on the ABP Framework, an open source and community driven web application framework for ASP.NET Core.</p><p>ABP Framework provides an excellent infrastructure to write maintainable, extensible and testable code with best practices.</p><p>Built on and integrated to popular tools you already know. Low learning curve, easy adaptation, comfortable development.</p>",
"ExploreTheABPFramework":"Explore the ABP Framework",
"WhyUseTheABPCommercial":"Why Use The ABP Commercial?",
"WhyUseTheABPCommercialExplanation":"<p class=\"lead mt- 5\">Building enterprise-grade web applications can be complex and time-consuming.</p><p>ABP Commercial offers the perfect base infrastructure necessary for all modern enterprise-grade ASP.NET Core based solutions. Right from the design to deployment, the entire development cycle is empowered by ABP's built-in features & modules.</p>",
"StartupTemplatesShortDescription":"Startup templates make you jump-start to your project in a few seconds.",
"AbpSuiteShortDescription":"ABP Suite is a complementary tool to the ABP Commercial.",
"AbpSuiteExplanation":"It allows you to build web pages in a matter of minutes. It's a .NET Core Global tool which can be installed from the command line. It can create a new ABP solution, generate CRUD pages from the database to the front-end.",
"Details":"Details",
"LeptonTheme":"Lepton Theme",
"ProfessionalModernUIThemes":"Professional, modern UI themes",
"LeptonThemeExplanation":"Lepton provides a gamut of Bootstrap admin themes that serve as a solid foundation for any project requiring admin dashboard.",
"DefaultTheme":"Default Theme",
"MaterialTheme":"Material Theme",
"Default2Theme":"Default 2 Theme",
"DarkTheme":"Dark Theme",
"DarkBlueTheme":"Dark Blue Theme",
"LightTheme":"Light Theme",
"ProudToWorkWith":"Proud to Work With",
"OurConsumers":"Hundreds of enterprises and developers over 50 countries worldwide rely on ABP Commercial.",
"JoinOurConsumers":"Join them and build amazing products fast.",
"AdditionalServicesExplanation":"Do you need additional or custom services? <strong>We and our partners can provide;</strong>",
"PremiumSupportExplanation":"Beside the great community support of the ABP framework, our support team answers technical questions and problems of the commercial users with high priority.",
"SeeTheSupportOptions":"See the Support Options",
"Contact":"Contact",
"TellUsWhatYouNeed":"Tell us what you need.",
"YourMessage":"Your Message",
"YourFullName":"Your full name",
"EmailField":"E-mail Address",
"YourEmailAddress":"Your e-mail address",
"HowMayWeHelpYou":"How may we help you",
"SendMessage":"Send Message",
"Success":"Success",
"WeWillReplyYou.":"Your message is sent! We will reply you in a short time.",
"GoHome":"Go Home",
"CreateLiveDemo":"Create Live Demo",
"RegisterToTheNewsletter":"Register to the newsletter to get information on happenings about ABP.IO, like new releases.",
"EnterYourEmailOrLogin":"Enter your e-mail address to create your demo or <a href=\"{0}\">Login</a> using your existing account.",
"ApplicationTemplate":"Application Template",
"ApplicationTemplateExplanation":"Application startup template is used to create a new web application.",
"AlreadyIncludedInTemplateModules":"Following modules are already included and configured in this template:",
"ApplicationTemplateArchitecture":"This application template also supports tiered architecture where UI layer, API layer and the authentication service are physically separated.",
"SeeTheGuideOrGoToTheLiveDemo":"See the developer guide for technical information about this template or go to the live demo.",
"DeveloperGuide":"Developer Guide",
"ModuleTemplate":"Module Template",
"ModuleTemplateExplanation1":"You want to create a module and reuse across different applications? This startup template prepares everything to start to create a reusable <strong>application module</strong> or a <strong>microservice</strong>.",
"ModuleTemplateExplanation2":"<p>You can support single or multiple UI frameworks, single or multiple database providers for a single module. The startup template is configured to run and <strong>test your module</strong> in a minimal application in addition to the unit and integration test infrastructure. </p> <p>See the developer guide for technical information about this template.</p>",
"WithAllStyleOptions":"with all style options",
"Demo":"Demo",
"SeeAllModules":"See All Modules",
"ABPCLIExplanation":"ABP CLI (Command Line Interface) is a command line tool to perform some common operations for ABP based solutions.",
"ABPSuiteEasilyCURD":"ABP Suite is a tool which allows you to easily create CRUD pages",
"WeAreHereToHelp":"We are Here to <span class=\"zero-text\">Help</span>",
"BrowseOrAskQuestion":"You can browse our help topics or search in frequently asked questions, or you can ask us a question by using the <a href=\"{0}\" class=\"text-success\">contact form</a>.",
"SearchQuestionPlaceholder":"Search in frequently asked questions",
"WhatIsTheABPCommercial":"What is the ABP Commercial?",
"WhatAreDifferencesThanAbpFramework":"What are the differences between the open source ABP Framework and the ABP Commercial?",
"ABPCommercialExplanation":"ABP Commercial is a set of premium modules, tools, themes and services built on top of the open source <a target=\"_blank\" href=\"{0}\">ABP framework</a>. ABP Commercial is being developed and supported by the same team behind the ABP framework.",
"WhatAreDifferencesThanABPFrameworkExplanation":"<p> <a target=\"_blank\" href=\"{0}\">ABP framework</a> is a modular, themeable, micro-service compatible application development framework for ASP.NET Core. It provides a complete architecture and a strong infrastructure to make you focusing on your own business code rather than repeating yourself for every new project. It is based on software development best practices and popular tools you already know. </p> <p> ABP framework is completely free, open source and community-driven. It also provides a free theme and some pre-built modules (e.g. identity management and tenant management).</p>",
"VisitTheFrameworkVSCommercialDocument":"Visit the following link, for more information <a href=\"{0}\" target=\"_blank\"> {1} </a>",
"ABPCommercialFollowingBenefits":"ABP Commercial adds the following benefits on top of the ABP framework;",
"Professional":"Professional",
"UIThemes":"UI themes",
"EnterpriseModules":"Enterprise ready, feature rich, pre-built <a href=\"{0}\">application modules</a> (e.g. Identity Server management, SaaS management, language management)",
"ToolingToSupport":"Tooling to support your development productivity (e.g. <a href=\"{0}\">ABP Suite</a>)",
"WhatDoIDownloadABPCommercial":"What do I download when I purchase the ABP Commercial?",
"CreateUnlimitedSolutions":"Once you purchase an ABP Commercial license, you will be able to create unlimited solutions like described in the <a href=\"{0}\">Getting Started</a> document.",
"ABPCommercialSolutionExplanation":"When you create a new application, you get a Visual Studio solution (a startup template) based on your preferences. The downloaded solution has commercial modules and themes already installed and configured for you. You can remove a pre-installed module or add another module if you like. All modules and themes are used a NuGet/NPM packages by default.",
"StartDevelopWithTutorials":"The downloaded solution is well architected and documented. You can start to develop your own business code based on it following <a href=\"{0}\">the tutorials</a>",
"TryTheCommercialDemo":"You can try <a href=\"{0}\">the demo</a> to see a sample application created using the ABP Commercial startup template.",
"HowManyProducts":"How many different products/solutions can I build using the ABP Commercial?",
"HowManyProductsExplanation":"There is no limit to create an ABP project. You can create as many project as you want, develop and upload them to different servers.",
"HowManyDevelopers":"How many developers can work on the ABP Commercial?",
"HowManyDevelopersExplanation":"ABP Commercial licenses are per developer. Different license types have different developer limits. However, you can add more developers to any license type whenever you need. See <a href=\"{0}\">the prices</a> page for license types, developer limits and additional developer costs.",
"ChangingLicenseType":"Can I change my license type in the future?",
"ChangingLicenseTypeExplanation":"You can always add new developers in your same license type. See also \"How many developers can work on the ABP Commercial?\". You can also upgrade to a higher license by paying the calculated price difference. When you upgrade to a higher license plan, you get the benefits of the new plan, but the license upgrade does not change the license expiry date.",
"LicenseExtendUpgradeDiff":"What is the difference between license extend and upgrade?",
"LicenseExtendUpgradeDiffExplanation":"<strong>Extending:</strong> By extending/renewing your license, you will continue to get premium support and get major updates for the modules and themes. Besides, you will be able to continue creating new projects. And you will still be able to use ABP Suite which speeds up your development.<hr/><strong>Upgrading:</strong> By upgrading your license, you will promote to a higher license plan which will allow you to get additional benefits. See the <a href=\"/pricing\">license comparison table</a> to check the differences between the license plans.<strong>On the other hand, when you upgrade, your license expiry date will not change!</strong>To extend your license end date, you need to extend your license.",
"LicenseRenewalCost":"What is the license renewal cost after 1 year?",
"LicenseRenewalCostExplanation":"You can renew (extend) your license by paying %80 of the current license price. For example; Standard ABP Team License is <span class=\"text-muted\">$</span>{0} and renewal price of the Team License is <span class=\"text-muted\">$</span>{1}.",
"IsSourceCodeIncluded":"Does my license include the source code of the commercial modules and themes?",
"IsSourceCodeIncludedExplanation1":"Depends on the license type you've purchased:",
"IsSourceCodeIncludedExplanation2":"<strong>Team</strong>: Your solution uses the modules and the themes as NuGet and NPM packages. It doesn't include their source code. In this way, you can easily upgrade these modules and themes whenever a new version is available. However, you can not get the source code of the modules and the themes.",
"IsSourceCodeIncludedExplanation3":"<strong>Business/Enterprise</strong>: In addition to the Team license, you are able to download the source code of any module or theme you need. You can even remove the NuGet/NPM package references for a particular module and add its source code directly to your solution to fully change it.",
"IsSourceCodeIncludedExplanation4":"<p>Including the source code of a module to your solution gives you the maximum freedom to customize that module. However, then it will not be possible to automatically upgrade the module when a new version is released.</p><p>None of the licenses include the ABP Suite source code, which is an external tool that generates code for you and assist to your development.</p><p>See <a href=\"{0}\">the pricing</a> page for other differences between the license types.</p>",
"ChangingDevelopers":"Can I change the registered developers of my organization in the future?",
"ChangingDevelopersExplanation":"In addition to add new developers to your license, you can also change the existing developers (you can remove a developer and add a new one to the same seat) without any additional cost.",
"WhatHappensWhenLicenseEnds":"What happens when my license period ends?",
"WhatHappensWhenLicenseEndsExplanation1":"ABP Commercial has <a href=\"{0}\" target=\"_blank\">perpetual license type</a>.After your license expires, you can continue developing your project. And you are not obliged to renew your license. After your license expires;",
"WhatHappensWhenLicenseEndsExplanation2":"You can not create new solutions using the ABP Commercial, but you can continue to develop your existing applications forever.",
"WhatHappensWhenLicenseEndsExplanation3":"You will be able to get updates for the modules and themes within your MAJOR version. For example; if you are using v3.2.0 of a module, you can still get updates for v3.x.x (v3.3.0, v3.5.2... etc.) of that module. But you cannot get updates for the next major version (like v4.x, v5.x)",
"WhatHappensWhenLicenseEndsExplanation4":"You can not install new modules and themes added to the ABP Commercial platform after your license ends.",
"WhatHappensWhenLicenseEndsExplanation5":"You can not use the ABP Suite.",
"WhatHappensWhenLicenseEndsExplanation6":"You can not get the <a href=\"{0}\">premium support</a> anymore.",
"WhatHappensWhenLicenseEndsExplanation7":"You can renew your subscription if you want to continue to get these benefits. There is a 20% discount when you renew your subscription.",
"WhenShouldIRenewMyLicense":"When should I renew my license?",
"WhenShouldIRenewMyLicenseExplanation1":"If you renew your license within <strong>1 month</strong> after your license expires, %20 discount will be applied to total license price.",
"WhenShouldIRenewMyLicenseExplanation2":"If you renew your license after 1 month from your license expire date, the renew price will be same as license purchase price and there will be no discount for your renewal.",
"TrialPlan":"Do you have a trial plan?",
"TrialPlanExplanation":"For now, ABP Commercial doesn't have a trial plan. For the Team licenses we provide 30 days money back guarantee. You can just request a refund in the first 30 days. For the Business and Enterprise licenses, we provide 60% refund in 30 days. This is because Business and Enterprise licenses include the full source code of all the modules and the themes.",
"DoYouAcceptBankWireTransfer":"Do you accept bank wire transfer?",
"DoYouAcceptBankWireTransferExplanation":"Yes, we accept bank wire transfer.<br />After sending the license amount via bank wire transfer, send us your receipt and the requested license type via e-mail.<br />Our international bank account information:",
"HowToUpgrade":"How to upgrade existing applications when a new version is available?",
"HowToUpgradeExplanation1":"When you create a new application using ABP Commercial, all the modules and the theme are used as NuGet and NPM packages. So, you can easily upgrade the packages when a new version is available.",
"HowToUpgradeExplanation2":"In addition to the standard NuGet/NPM upgrades, <a href=\"{0}\">ABP CLI</a> provides an update command that automatically finds and upgrades all ABP related packages in your solution.",
"DatabaseSupport":"Which database systems are supported?",
"DatabaseSupportExplanation":"ABP Framework itself is database agnostic and can work with any database provider by its nature. See <a href=\"{0}\" target=\"_blank\">the data access document</a> for a list of currently implemented providers.",
"UISupport":"Which UI frameworks are supported?",
"Supported":"Supported",
"UISupportExplanation":"ABP Framework itself is UI framework agnostic and can work with any UI framework. However, startup templates, module UIs and themes were not implemented for all UI frameworks. See <a href=\"{0}\">the getting started document</a> for the up-to-date list of UI options.",
"MicroserviceSupport":"Does it support the micro-service architecture?",
"MicroserviceSupportExplanation1":"One of the major goals of the ABP framework is to provide a convenient infrastructure to create micro-service solutions. See the <a href=\"{0}\">micro-service architecture</a> document to understand how it helps to create micro-service systems.",
"MicroserviceSupportExplanation2":"All the ABP Commercial modules are designed to support micro-service deployment scenarios (with its own API and database) by following the <a href=\"{0}\">module development best practices</a> document.",
"MicroserviceSupportExplanation3":"We provide a sample <a href=\"{0}\">micro-service demo solution</a>that demonstrates a micro-service architecture implementation to help you to create your own solution.",
"MicroserviceSupportExplanation4":"So, the short answer is \"<strong>yes, it supports micro-service architecture</strong>\".",
"MicroserviceSupportExplanation5":"However, a micro-service system is a solution and every solution will have different requirements, network topology, communication scenarios, authentication possibilities, database separation/sharing decisions, runtime configurations, 3rd party system integrations and many more.",
"MicroserviceSupportExplanation6":"The ABP Framework and the ABP Commercial provides infrastructure for micro-service scenarios, micro-service compatible modules, samples and documentation to help you to build your own solution. But don't expect to directly download your dream solution pre-built for you. You will need to understand it and bring some parts together based on your requirements.",
"WhereCanIDownloadSourceCode":"Where can I download source-code?",
"WhereCanIDownloadSourceCodeExplanation":"You can download the source code of all ABP modules, Angular packages and themes via ABP Suite or ABP CLI. See <a href=\"{0}\">How to download source-code?</a>",
"ComputerLimitation":"How many computers can a developer login when developing ABP?",
"ComputerLimitationExplanation":"We specifically permit <strong>{0} computers</strong> per individual/licensed developer. Whenever there is a need for a developer to develop ABP Commercial products on a third machine, an e-mail should be sent to license@abp.io explaining the situation and we will then make the appropriate allocation in our system.",
"RefundPolicy":"Do you have a refund policy?",
"RefundPolicyExplanation":"You can request a refund within <strong>30 days</strong> of your license purchase. The Business and Enterprise license types have source-code download option, therefore refunds are not available for the Business and Enterprise (and any licenses that include a right to receive source-code). In addition, no refunds are made for renewals and second license purchases.",
"HowCanIRefundVat":"How can I refund VAT?",
"HowCanIRefundVatExplanation1":"If you made the payment using 2Checkout, you can refund VAT via your 2Checkout account:",
"HowCanIRefundVatExplanation2":"Log in into your <a href=\"https://secure.2checkout.com/cpanel/login.php\" target=\"_blank\">2Checkout</a> account",
"HowCanIRefundVatExplanation3":"Find the appropriate order and press \"Refund Belated VAT\" (enter your VAT ID)",
"HowCanIGetMyInvoice":"How can I get my invoice?",
"HowCanIGetMyInvoiceExplanation":"There are 2 payment gateways for purchasing a license: PayU and 2Checkout. If you purchase your license through 2Checkout gateway, it sends the PDF invoice to your email address, see <a href=\"https://knowledgecenter.2checkout.com/Documentation/03Billing-and-payments/Payment-operations/How-do-invoices-work\">2Checkout invoicing.</a> If you purchase through the PayU gateway or via bank wire transfer, we will prepare and send your invoice. You can request your invoice from the <a href=\"{0}\">organization management page.</a>",
"Forum":"Forum",
"SupportExplanation":"ABP Commercial licenses provides a premium forum support by a team consists of the ABP Framework experts.",
"PrivateTicket":"Private Ticket",
"PrivateTicketExplanation":"Enterprise License also includes a private support with e-mail and ticket system.",
"AbpSuiteExplanation1":"ABP Suite allows you to build web pages in a matter of minutes. It's a .NET Core Global tool that can be installed from the command line.",
"AbpSuiteExplanation2":"It can create a new ABP solution, generate CRUD pages from the database to the front-end. For technical overview see <a href=\"{0}\">the document</a>",
"FastEasy":"Fast & Easy",
"AbpSuiteExplanation3":"ABP Suite allows you to easily create CRUD pages. You just need to define your entity and its properties, let the rest to ABP Suite for you! ABP Suite generates all the necessary code for your CRUD page in a few seconds. It supports Angular, MVC and Blazor user interfaces.",
"RichOptions":"Rich Options",
"AbpSuiteExplanation4":"ABP Suite supports multiple UI options like <a href=\"https://docs.microsoft.com/en-us/aspnet/core/razor-pages\">Razor Pages</a> and <a href=\"https://angular.io\">Angular</a>.It also supports multiple databases like <a href=\"https://www.mongodb.com\">MongoDB</a> and all databases supported by <strong>EntityFramework Core</strong> (MS SQL Server, Oracle, MySql, PostgreSQL and <a href=\"https://docs.microsoft.com/en-us/ef/core/providers/?tabs=dotnet-core-cli\">more</a>).",
"AbpSuiteExplanation5":"Good thing is that, you don't have to worry about those options. ABP Suite understands your project type and generates the code for your project and places the generated code in correct place in your project.",
"SourceCode":"Source Code",
"AbpSuiteExplanation6":"ABP Suite generates the source code for you! It doesn't generate magic files to generate the web page. ABP Suite generates the source code for <strong>Entity, Repository, Application Service, Code First Migration, JavaScript/TypeScript and CSHTML/HTML</strong> and necessary Interfaces as well. ABP Suite also generates the code according to <strong>Best Practices</strong> of software development, so you don't have to worry about generated code's quality.",
"AbpSuiteExplanation7":"Since you have the source code of building blocks of the generated CRUD page in correct application layers, you can easily modify the source code and inject your custom/bussiness logic to the generated code.",
"CrossPlatform":"Cross Platform",
"AbpSuiteExplanation8":"ABP Suite is built with .NET Core and it is cross platform. It runs as a web application on your local computer. You can run it on <strong>Windows</strong>, <strong>Mac</strong> and <strong>Linux</strong>",
"OtherFeatures":"Other Features",
"OtherFeatures1":"Updates <strong>NuGet</strong> and <strong>NPM</strong> packages on your solution easily.",
"OtherFeatures2":"Regenerates already generated pages from scratch.",
"OtherFeatures3":"Creates new solutions",
"ThanksForCreatingProject":"Thanks for Creating Your Project!",
"HotToRunSolution":"How to run your solution?",
"HotToRunSolutionExplanation":"See getting started document to learn how to configure and run your solution.",
"GettingStarted":"Getting Started",
"WebAppDevTutorial":"Web App Dev Tutorial",
"WebAppDevTutorialExplanation":"See web application development tutorial document for a step by step development sample.",
"Document":"Document",
"UsingABPSuiteToCURD":"Using ABP Suite for CRUD Page Generation & Tooling",
"SeeABPSuiteDocument":"See ABP Suite document to learn the usage of ABP Suite.",
"AskQuestionsOnSupport":"You can ask questions on ABP Commercial Support.",
"Documentation":"Documentation",
"SeeModulesDocument":"See modules document for a list of all commercial (pro) modules and their documents.",
"Pricing":"Pricing",
"PricingExplanation":"Choose the features and functionality your business needs today. Easily upgrade as your business grows.",
"SeeCliDocumentForMoreInformation":"Weitere Optionen finden Sie im <a href=\"{0}\">ABP CLI-Dokument</a> oder wählen Sie oben die Registerkarte \"Direkter Download\".",
"Optional":"Optional",
"LocalFrameworkRef":"Behalten Sie die lokale Projektreferenz für die Framework-Pakete bei.",
"SelectLanguage":"Sprache auswählen"
"SelectLanguage":"Sprache auswählen",
"LatestArticleOnCommunity":"Neuester Artikel zur ABP Community",
"MultipleUIOptionsExplanation":"The core framework is designed as UI independent and can work with any type of UI system, while there are multiple pre-built and integrated options are provided out of the box.",
"MultipleDBOptionsExplanation":"The framework can work with any data source, while the following providers are officially developed and supported:",
"SelectLanguage":"Select language"
"SelectLanguage":"Select language",
"LatestArticleOnCommunity":"Latest Article on ABP Community"
"MultipleUIOptionsExplanation":"The core framework is designed as UI independent and can work with any type of UI system, while there are multiple pre-built and integrated options are provided out of the box.",
"MultipleDBOptionsExplanation":"The framework can work with any data source, while the following providers are officially developed and supported;",
"SelectLanguage":"Select language"
"SelectLanguage":"Select language",
"LatestArticleOnCommunity":"Latest Article on ABP Community",
"SeeCliDocumentForMoreInformation":"Ver el <a href=\"{0}\">documento ABP CLI </a> para más opciones o selecciona la \"Direct Download\" pestaña de arriba.",
"Optional":"Opcional",
"LocalFrameworkRef":"Mantén la referencia al proyecto local para los paquetes del framework.",
"SelectLanguage":"Vali keel"
"SelectLanguage":"Vali keel",
"LatestArticleOnCommunity":"Último artículo sobre la comunidad ABP",
@ -66,6 +66,26 @@ Defining multiple connections is allowed. In this case, you can use different co
}
````
If you need to connect to the RabbitMQ cluster, you can use the `;` character to separate the host names.
**Example: Connect to the RabbitMQ cluster**
```json
{
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "123.123.123.123;234.234.234.234"
}
},
"EventBus": {
"ClientName": "MyClientName",
"ExchangeName": "MyExchangeName"
}
}
}
```
#### AbpRabbitMqOptions
`AbpRabbitMqOptions` class can be used to configure the connection strings for the RabbitMQ. You can configure this options inside the `ConfigureServices` of your [module](Module-Development-Basics.md).
* `--with-source-code`: Downloads the source code of the module to your solution folder and uses local project references instead of NuGet/NPM packages. This options is always `True` if `--new` is used.
* `--add-to-solution-file`: Adds the downloaded/created module to your solution file, so you will also see the projects of the module when you open the solution on a IDE. (only available when `--with-source-code` is `True`.)
### list-modules
Lists names of open-source application modules.
Usage
````bash
abp list-modules [options]
````
Example:
```bash
abp list-modules
```
#### Options
* `--include-pro-modules`: Includes commercial (pro) modules in the output.
### get-source
Downloads the source code of a module to your computer.
@ -196,12 +196,16 @@ This example replaces the `AccountController` (An API Controller defined in the
**`[ExposeServices(typeof(AccountController))]` is essential** here since it registers this controller for the `AccountController` in the dependency injection system. `[Dependency(ReplaceServices = true)]` is also recommended to clear the old registration (even the ASP.NET Core DI system selects the last registered one).
In addition, The `AccountController` will be removed from [`ApplicationModel`](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.applicationmodels.applicationmodel.controllers) because it defines `ExposeServicesAttribute`. If you don't want to remove it, you can configure `AbpAspNetCoreMvcOptions`:
In addition, the `MyAccountController` will be removed from [`ApplicationModel`](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.applicationmodels.applicationmodel.controllers) because it defines `ExposeServicesAttribute`.
If `IncludeSelf = true` is specified, i.e. `[ExposeServices(typeof(AccountController), IncludeSelf = true)]`, then `AccountController` will be removed instead. This is useful for **extending** a controller.
If you don't want to remove either controller, you can configure `AbpAspNetCoreMvcOptions`:
Open the `en.json` (*the English translations*) file and change the content as below:
@ -157,7 +157,7 @@ It's time to create something visible and usable! Instead of classic MVC, we wil
Create `Books` folder under the `Pages` folder of the `Acme.BookStore.Web` project. Add a new Razor Page by right clicking the Books folder then selecting **Add > Razor Page** menu item. Name it as `Index`:
Open the `Index.cshtml` and change the whole content as shown below:
@ -208,7 +208,7 @@ context.Menu.AddItem(
Run the project, login to the application with the username `admin` and the password `1q2w3E*` and see the new menu item has been added to the main menu:
@ -490,7 +488,7 @@ export class BookComponent implements OnInit {
```
* We imported and injected the generated `BookService`.
* We are using the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service), a utility service of the ABP Framework which provides easy pagination, sorting and searching.
* We are using the [ListService](../UI/Angular/List-Service.md), a utility service of the ABP Framework which provides easy pagination, sorting and searching.
Open the `/src/app/book/book.component.html` and replace the content as below:
@ -531,7 +529,7 @@ Open the `/src/app/book/book.component.html` and replace the content as below:
Now you can see the final result on your browser:


@ -124,7 +124,7 @@ Created this class inside the `Acme.BookStore.Domain.Shared` project since we wi
## AuthorManager: The Domain Service
`Author` constructor and `ChangeName` method is`internal`, so they can be usable only in the domain layer. Create an `AuthorManager` class in the `Authors` folder (namespace) of the `Acme.BookStore.Domain` project:
`Author` constructor and `ChangeName` methods are`internal`, so they can be used only in the domain layer. Create an `AuthorManager` class in the `Authors` folder (namespace) of the `Acme.BookStore.Domain` project:
* `AuthorManager` forces to create an author and change name of an author in a controlled way. The application layer (will be introduced later) will use these methods.
> **DDD tip**: Do not introduce domain service methods unless they are really needed and perform some core business rules. For this case, we needed to this service to be able to force the unique name constraint.
> **DDD tip**: Do not introduce domain service methods unless they are really needed and perform some core business rules. For this case, we needed this service to be able to force the unique name constraint.
Both methods checks if there is already an author with the given name and throws a special business exception, `AuthorAlreadyExistsException`, defined in the `Acme.BookStore.Domain` project (in the `Authors` folder) as shown below:
@ -226,7 +226,7 @@ This is a unique string represents the error code thrown by your application and
"BookStore:00001": "There is already an author with the same name: {name}"
````
Whenever you throw an `AuthorAlreadyExistsException`, the end use will see a this message on the UI.
Whenever you throw an `AuthorAlreadyExistsException`, the end user will see a nice error message on the UI.
@ -27,13 +27,13 @@ An `HttpInterceptor` is able to catch `HttpErrorResponse` and can be used for
## RestService
ABP core module has a utility service for HTTP requests: `RestService`. Unless explicitly configured otherwise, it catches HTTP errors and dispatches a `RestOccurError` action. This action is then captured by the `ErrorHandler` introduced by the `ThemeSharedModule`. Since you should already import this module in your app, when the `RestService` is used, all HTTP errors get automatically handled by deafult.
ABP core module has a utility service for HTTP requests: `RestService`. Unless explicitly configured otherwise, it catches HTTP errors and dispatches a `RestOccurError` action. This action is then captured by the `ErrorHandler` introduced by the `ThemeSharedModule`. Since you should already import this module in your app, when the `RestService` is used, all HTTP errors get automatically handled by default.
### Getting Started with RestService
In order to use the `RestService`, you must inject it in your class as a dependency.
In order to use the `RestService`, you must inject it in your class as a dependency.
```js
import { RestService } from '@abp/ng.core';
@ -200,6 +200,101 @@ getSomeCustomHeaderValue() {
}
```
You may find `Rest.Observe` enum [here](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/rest.ts#L10).
You may find `Rest.Observe` enum [here](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/rest.ts#L10).
## HTTP Error Handling
When the `RestService` is used, all HTTP errors are automatically handled by `ErrorHandler` which is a service that exposed by the `@abp/ng.theme.shared` package.
### Custom HTTP Error Handler
A custom HTTP error handler can be registered to an injection token named `HTTP_ERROR_HANDLER`. If a custom handler function is registered, the `ErrorHandler` executes that function.
See an example:
```js
// http-error-handler.ts
import { ContentProjectionService, PROJECTION_STRATEGY } from '@abp/ng.core';
import { ToasterService } from '@abp/ng.theme.shared';
import { HttpErrorResponse } from '@angular/common/http';
import { Injector } from '@angular/core';
import { throwError } from 'rxjs';
import { Error404Component } from './error404/error404.component';
export function handleHttpErrors(injector: Injector, httpError: HttpErrorResponse) {
- Created a function named `handleHttpErrors` and defined as value of the `HTTP_ERROR_HANDLER` provider in app.module. After this, the function executes when an HTTP error occurs.
- 400 bad request errors is handled. When a 400 error occurs, backend error message will be displayed as shown below:
- Since `throwError(httpError)` is returned at bottom of the `handleHttpErrors`, the `ErrorHandler` will handle the HTTP errors except 400 and 404 errors.
**Note 1:** If you put `return` to next line of handling an error, default error handling will not work for that error.
```js
export function handleHttpErrors(injector: Injector, httpError: HttpErrorResponse) {
if (httpError.status === 403) {
// handle 403 errors here
return; // put return to skip default error handling
}
}
```
**Note 2:** If you put `return throwError(httpError)`, default error handling will work.
- `throwError` is a function. It can be imported from `rxjs`.
- `httpError` is the second parameter of the error handler function which is registered to the `HTTP_ERROR_HANDLER` provider. Type of the `httpError` is `HttpErrorResponse`.
```js
import { throwError } from 'rxjs';
export function handleHttpErrors(injector: Injector, httpError: HttpErrorResponse) {
if (httpError.status === 500) {
// handle 500 errors here
return;
}
// you can return the throwError(httpError) at bottom of the function to run the default handler of ABP for HTTP errors that you didn't handle above.
Additional UI extensibility points ([Entity action extensions](https://docs.abp.io/en/abp/latest/UI/Angular/Entity-Action-Extensions), [data table column extensions](https://docs.abp.io/en/abp/latest/UI/Angular/Data-Table-Column-Extensions), [page toolbar extensions](https://docs.abp.io/en/abp/latest/UI/Angular/Page-Toolbar-Extensions) and others) are used in ABP pages to allow to control entity actions, table columns and page toolbar of a page. If you replace a page, you need to apply some configurations to be able to work extension components in your component. Let's see how to do this by replacing the roles page.
Create a new module called `MyRolesModule`:
```bash
yarn ng generate module my-roles --module app
```
Create a new component called `MyRolesComponent`:
```bash
yarn ng generate component my-roles/my-roles --flat --export
```
Open the generated `src/app/my-roles/my-roles.component.ts` file and replace its content with the following:
```js
import { ListService, PagedAndSortedResultRequestDto } from '@abp/ng.core';
import {
CreateRole,
DeleteRole,
eIdentityComponents,
GetRoleById,
GetRoles,
IdentityRoleDto,
IdentityState,
RolesComponent,
UpdateRole,
} from '@abp/ng.identity';
import { ePermissionManagementComponents } from '@abp/ng.permission-management';
import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared';
import {
EXTENSIONS_IDENTIFIER,
FormPropData,
generateFormFromProps,
} from '@abp/ng.theme.shared/extensions';
import { Component, Injector, OnInit } from '@angular/core';
The two providers we have defined in `MyRolesComponent` are required for the extension components to work correctly.
* With the first provider, we defined the extension identifier for using `RolesComponent`'s extension actions in the `MyRolesComponent`.
* With the second provider, we have replaced the `RolesComponent` injection with the `MyRolesComponent`. Default extension actions of the `RolesComponent` try to get `RolesComponent` instance. However, the actions can get the `MyRolesComponent` instance after defining the second provider.
Open the generated `src/app/my-role/my-role.component.html` file and replace its content with the following:
We have added the `abp-page-toolbar`, `abp-extensible-table`, and `abp-extensible-form` extension components to template of the `MyRolesComponent`.
You should import the required modules for the `MyRolesComponent` to `MyRolesModule`. Open the `src/my-roles/my-roles.module.ts` file and replace the content with the following:
```js
import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions';
import { NgModule } from '@angular/core';
import { SharedModule } from '../shared/shared.module';
import { MyRolesComponent } from './my-roles.component';
import { PermissionManagementModule } from '@abp/ng.permission-management';
- `UiExtensionsModule` imported to be able to use the extension components in your component.
- `PermissionManagementModule` imported to be able to use the `abp-permission-*management` in your component.
As the last step, it is needs to be replaced the `RolesComponent` with the `MyRolesComponent`. Open the `app.component.ts` and modify its content as shown below:
```js
import { ReplaceableComponentsService } from '@abp/ng.core';
import { eIdentityComponents } from '@abp/ng.identity';
import { MyRolesComponent } from './my-roles/my-roles.component';
After the steps above, the `RolesComponent` has been successfully replaced with the `MyRolesComponent`. When you navigate to the `/identity/roles` URL, you will see the `MyRolesComponent`'s template and see the extension components working correctly.
> **Important Note:** The `application.baseUrl` and the `{0}` placeholder in the value of the `baseUrl` property are required to be able to get tenant from running URL. Other placeholders in API URLs are optional.
After the configuration above, if your app runs on the `mytenant1.mydomain.com`, the app will get tenant name as **mytenant1** and replace the environment object in `ConfigState` on app initialization as follows:
After the configuration above, if your app runs on the `mytenant1.mydomain.com`, the app will get tenant name as **mytenant1** and replace the environment object in `EnvironmentService` on app initialization as follows:
`RouterEvents` is a utility service to provide an easy implementation for one of the most frequent needs in Angular templates: `TrackByFunction`. Please see [this page in Angular docs](https://angular.io/guide/template-syntax#ngfor-with-trackby) for its purpose.
`RouterEvents` is a utility service for filtering specific router events and reacting to them. Please see [this page in Angular docs](https://angular.io/api/router/Event) for available router events.
@ -137,3 +137,7 @@ export class BookComponent implements OnInit {
```
> Please [see this article](https://github.com/abpframework/abp/blob/dev/docs/en/Blog-Posts/2020-09-07%20Angular-Service-Proxies/POST.md) to learn more about service proxies.
### Known Limitations
When you run a project on Visual Studio using IIS Express as the web server, there will be no remote access to your endpoints. This is the default behavior of IIS Express since it explicitly protects you from the security risks of running over the network. However, that will cause the proxy generator to fail because it needs a response from the `/api/abp/api-definition` endpoint. You may serve your endpoints via Kestrel to avoid this. Running `dotnet run` in your command line (at your project folder) will do that for you.
Logger.LogInformation($"Removing the controller{(exposedControllerModels.Length > 1 ? "s" : "")} {exposeServicesAttr.ServiceTypes.Select(c => c.AssemblyQualifiedName).JoinAsString(",")} from the application model since {(exposedControllerModels.Length > 1 ? "theyare" : "itis")} replaced by the controller: {controllerModel.ControllerType.AssemblyQualifiedName}");
Logger.LogInformation($"Removing the controller {controllerModel.ControllerType.AssemblyQualifiedName} from the application model since it replaces the controller(s): {baseControllerTypes.Select(c => c.AssemblyQualifiedName).JoinAsString(",")}");
Logger.LogInformation($"Removing the controller {controllerModel.ControllerType.AssemblyQualifiedName} from the application model since it replaces the controller(s): {baseControllerTypes.Select(c => c.AssemblyQualifiedName).JoinAsString(",")}");
/*X-Content-Type-Options header tells the browser to not try and “guess” what a mimetype of a resource might be, and to just take what mimetype the server has returned as fact.*/
/*X-XSS-Protection is a feature of Internet Explorer, Chrome and Safari that stops pages from loading when they detect reflected cross-site scripting (XSS) attacks*/
/*The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a <frame>, <iframe> or <object>. SAMEORIGIN makes it being displayed in a frame on the same origin as the page itself. The spec leaves it up to browser vendors to decide whether this option applies to the top level, the parent, or the whole chain*/