Open Closed

How to add a new Module to existing Solution #80


User avatar
0
ricardo.carvalho created

Hi.
I created a new solution for my Main project and now I'm trying to add a new Module to it. My solution uses Angular and I'm creating the new module with --no-ui so that I can then create the Angular modules separate.

I added the new module to a sub-folder of the solution and added Existing Project to the main solution like it was suggested in https://support.abp.io/QA/Questions/3 below.

Hi,

Every module can be a separate solution (like we did for the modules) or you can develop it under a single Visual Studio solution (for example, in the microservice demo, we've included a product module into the solution).

I suggest you to go with a single solution at the beginning since it is easier to develop, test, run and maintain. You know, in a single solution, you can cross reference projects. Assuming you will create your module as layered (like this), your application's domain layer should depend on the module's domain layer and so on (as a good practice, but you don't have to do).
Also, add standard DependsOn attribute (see the document) when you add a project reference.

You can create a new module (using abp new MyProductName.MyModuleName -t module-pro - see), then add its projects to the application's solution then add references and dependson attributes. In the future, we will also automate this.

For the UI part, you can investigate the Angular UI modules we've created to understand how a module is developed. We are using them as NPM packages in the main application, however it may not be practical in development. @mehmet can write you more about that.

My solution now has the following structure.

image.png

I then went to the main Gmcs.Themis.HttpApi.Host and added the depends on the new module

image.png

Everything compiles and Runs, and the new methods for the Module display in Swagger but when i try to execute it fails and the following error is added to the Log.

2020-03-30 15:30:44.137 +01:00 [INF] Request starting HTTP/1.1 GET https://localhost:44338/api/ScreenBuilder/sample
2020-03-30 15:30:44.142 +01:00 [INF] Identity.Application was not authenticated. Failure message: Unprotect ticket failed
2020-03-30 15:30:44.142 +01:00 [DBG] AuthenticationScheme: Bearer was not authenticated.
2020-03-30 15:30:44.144 +01:00 [INF] Identity.Application was not authenticated. Failure message: Unprotect ticket failed
2020-03-30 15:30:44.144 +01:00 [INF] Identity.Application was not authenticated. Failure message: Unprotect ticket failed
2020-03-30 15:30:44.148 +01:00 [INF] Executing endpoint 'Gmcs.Themis.ScreenBuilder.Samples.SampleController.GetAsync (Gmcs.Themis.ScreenBuilder.HttpApi)'
2020-03-30 15:30:44.150 +01:00 [INF] Route matched with {action = "Get", controller = "Sample", area = "", page = ""}. Executing controller action with signature System.Threading.Tasks.Task1[Gmcs.Themis.ScreenBuilder.Samples.SampleDto] GetAsync() on controller Gmcs.Themis.ScreenBuilder.Samples.SampleController (Gmcs.Themis.ScreenBuilder.HttpApi). 2020-03-30 15:30:44.153 +01:00 [ERR] ---------- RemoteServiceErrorInfo ---------- 2020-03-30 15:30:44.154 +01:00 [ERR] { "code": null, "message": "An internal error occurred during your request!", "details": null, "validationErrors": null } 2020-03-30 15:30:44.154 +01:00 [ERR] An exception was thrown while activating Castle.Proxies.SampleControllerProxy. Autofac.Core.DependencyResolutionException: An exception was thrown while activating Castle.Proxies.SampleControllerProxy. ---> Autofac.Core.DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Castle.Proxies.SampleControllerProxy' can be invoked with the available services and parameters: Cannot resolve parameter 'Gmcs.Themis.ScreenBuilder.Samples.ISampleAppService sampleAppService' of constructor 'Void .ctor(Castle.DynamicProxy.IInterceptor[], Gmcs.Themis.ScreenBuilder.Samples.ISampleAppService)'. at Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(IComponentContext context, IEnumerable1 parameters)
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters, Object& decoratorTarget)
--- End of inner exception stack trace ---
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1 parameters, Object& decoratorTarget) at Autofac.Core.Resolving.InstanceLookup.Execute() at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable1 parameters)
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable1 parameters) at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Microsoft.AspNetCore.Mvc.Controllers.ServiceBasedControllerActivator.Create(ControllerContext actionContext)
at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2020-03-30 15:30:44.154 +01:00 [ERR] ---------- Exception Data ----------
2020-03-30 15:30:44.155 +01:00 [ERR] ActivatorChain = Castle.Proxies.SampleControllerProxy
2020-03-30 15:30:44.155 +01:00 [INF] Executing ObjectResult, writing value of type 'Volo.Abp.Http.RemoteServiceErrorResponse'.
2020-03-30 15:30:44.157 +01:00 [INF] Executed action Gmcs.Themis.ScreenBuilder.Samples.SampleController.GetAsync (Gmcs.Themis.ScreenBuilder.HttpApi) in 6.7848ms
2020-03-30 15:30:44.157 +01:00 [INF] Executed endpoint 'Gmcs.Themis.ScreenBuilder.Samples.SampleController.GetAsync (Gmcs.Themis.ScreenBuilder.HttpApi)'
2020-03-30 15:30:44.157 +01:00 [INF] Request finished in 20.4769ms 500 application/json; charset=utf-8

What an I missing?

Another option is, does anyone have a sample solution with more than one module being used using Angular?


1 Answer(s)
  • User Avatar
    0
    alper created
    Support Team Director

    The problem is dependency! Cannot resolve parameter 'Gmcs.Themis.ScreenBuilder.Samples.ISampleAppService'
    Check that SampleAppService is registered correctly.

    ISampleAppService.cs

    public interface ISampleAppService : IApplicationService
    {
             
    }
    

    SampleAppService.cs

    public class SampleAppService  : ApplicationService, ISampleAppService
    {
             
    }
    
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
Do you need assistance from an ABP expert?
Schedule a Meeting
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.3.0-preview. Updated on April 11, 2025, 10:10