What I understood: So the notification system expects the GUI to call into some
AppService
orController
where the code then can call aSubscribeAsync()
with the current user from that session. Is it that?
No, the user should only subscribe once (e.g. when the user is created) rather than in MyObjekteAppService.GetAll
.
Still the client side listens(?) to both events names, while just the first one would be right.
I don't understand what you mean by "just the first one would be right".
But perhaps this is not the right tool anyways? Because those entity updates I want to have do not really have to be persisted in any way. ... Or maybe using SingalR instead would be wise?
Yes. Documentation: https://aspnetboilerplate.com/Pages/Documents/SignalR-AspNetCore-Integration
Happy to help!
By the way, you don't need to create another interface when doing ReplaceService
unless you are extending the interface.
Also note that IStripePaymentAppService
already inherits IApplicationService
so you don't have to inherit that again.
The error message is clear.
To replace the service for IStripePaymentAppService
, you have to implement the interface.
In your case, make INuagecareStripePaymentAppService
inherit IStripePaymentAppService
.
You can implement domain event handlers for PersonCompany
and Address
in which you update AddressPersonCompany
.
See https://aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Events#handling-events.
Which namespace do you get .WhereIf
from?
Without Abp.Linq.Expressions
namespace, I believe .WhereIf
is doing an in-memory search that is equivalent to:
var addressPersonCompanies = _addressPersonCompanyRepository
.GetAll()
.Include(adr => adr.Address)
.Include(pers => pers.PersonCompany)
.Include(tit => tit.PersonCompany.Title)
+ .ToList()
.WhereIf(
!input.Filter.IsNullOrEmpty(),
e => searchwords.All(w => String
.Join(" ", e.PersonCompany.NameCompany, e.PersonCompany.Firstname, e.Address.Street, e.Address.Location)
.Contains(w, StringComparison.InvariantCultureIgnoreCase))
)
.ToList();
For performance, I suggest storing a pre-calculated NormalizedSearchTarget
property:
addressPersonCompany.NormalizedSearchTarget = String
.Join(" ", e.PersonCompany.NameCompany, e.PersonCompany.Firstname, e.Address.Street, e.Address.Location)
.ToUpperInvariant();
And then searching would be:
var searchwords = !input.Filter.IsNullOrEmpty()
? input.Filter.Split(" ").Select(w => w.ToUpperInvariant()).ToList()
: null;
e => searchwords.All(w => e.NormalizedSearchTarget.Contains(w))
I suppose it is run after RegisterAssemblyByConvention
in your module.
For compatibility<sup>1</sup> with
RegisterAssemblyByConvention
, configure a unique name.<sup>1</sup> If your concrete class implements ASP<span></span>.NET Boilerplate's
ITransientDependency
, then the default name is used to register the class for.WithService.Self()
insideRegisterAssemblyByConvention
.
context.IocManager.IocContainer.Register(
Classes.FromAssembly(context.Assembly)
.BasedOn<IExposedJob>()
.If(type => !type.GetTypeInfo().IsGenericTypeDefinition)
.WithService.Self()
.WithService.Base()
.WithService.AllInterfaces()
+ .Configure(configurer => configurer.Named(Guid.NewGuid().ToString()))
);
@CNS
Don't use void as the return type of an asynchronous method.
private async void ProcessReceiptTransfer(VoucherPostingDto input)
should beprivate async Task ProcessReceiptTransfer(VoucherPostingDto input)
ProcessReceiptTransfer
method?What is the error?
You need to cascade soft deletes yourself. See aspnetboilerplate/aspnetboilerplate#3559.