error: File does not exist (src\bin\Release\*.snupkg).
<PropertyGroup> ... <DebugSymbols>true</DebugSymbols> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> </PropertyGroup>
error: File does not exist (src\bin\Release\*.snupkg).
<PropertyGroup> ... <DebugSymbols>true</DebugSymbols> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> </PropertyGroup>
public class MainWindowViewModel : ViewModelBase { public MainWindowViewModel() : base() { ShowPleaseWait = new Command(OnShowPleaseWaitExecute); } public override string Title { get { return "View model title"; } } public Command ShowPleaseWait { get; private set; } private void OnShowPleaseWaitExecute() { var pleaseWaitService = GetService<IPleaseWaitService>(); pleaseWaitService.Show(() => { Thread.Sleep(3000); }); } }
<Button Margin="6" Command="{Binding ShowPleaseWait}" Content="Show PleaseWait!" />
var pleaseWaitService = GetService<IPleaseWaitService>(); pleaseWaitService.Show(() => { Thread.Sleep(3000); });
var uiService = GetService<IUIVisualizerService>(); var viewModel = new AnotherWindowViewModel(); uiService.Show(viewModel);
var openFileService = GetService<IOpenFileService>(); openFileService.Filter = "ZIP files (*.zip)|*.zip"; openFileService.IsMultiSelect = false; openFileService.Title = "Open file"; if (openFileService.DetermineFile()) { // ? }
var saveFileService = GetService<ISaveFileService>(); saveFileService.Filter = "ZIP files (*.zip)|*.zip"; saveFileService.FileName = "test"; saveFileService.Title = "Save file"; if (saveFileService.DetermineFile()) { // ? }
var processService = GetSetvice<IProcessService>(); processService.StartProcess(@"C:\Windows\System32\calc.exe");
var splashScreenService = GetService<ISplashScreenService>(); splashScreenService.Enqueue(new ActionTask("Creating the shell", OnCreateShell)); splashScreenService.Enqueue(new ActionTask("Initializing modules", OnInitializeModules)); splashScreenService.Enqueue(new ActionTask("Starting application", OnStartApplication));
var messageService = GetService<IMessageService>(); if (messageService.Show("Are you sure?", "?", MessageButton.YesNo, MessageImage.Warning) == MessageResult.Yes) { // ? }
namespace MinimalBlog.Api.Contracts; public interface IModule { IEndpointRouteBuilder RegisterEndpoints(IEndpointRouteBuilder endpoints); }
public static class ServiceCollectionExtensions { public static IServiceCollection AddApplicationServices(this IServiceCollection services, WebApplicationBuilder builder) { // ... builder.Services.AddAllModules(typeof(Program)); return services; } private static void AddAllModules(this IServiceCollection services, params Type[] types) { // Using the `Scrutor` to add all of the application's modules at once. services.Scan(scan => scan.FromAssembliesOf(types) .AddClasses(classes => classes.AssignableTo<IModule>()) .AsImplementedInterfaces() .WithSingletonLifetime()); } }
using MinimalBlog.Api.Contracts; namespace MinimalBlog.Api.Extensions; public static class ModuleExtensions { public static WebApplication RegisterEndpoints(this WebApplication app) { if (app == null) { throw new ArgumentNullException(nameof(app)); } var modules = app.Services.GetServices<IModule>(); foreach (var module in modules) { module.RegisterEndpoints(app); } return app; } }
using MinimalBlog.Api.Extensions; var builder = WebApplication.CreateBuilder(args); builder.Services.AddApplicationServices(builder); var app = builder.Build(); app.ConfigureApplication(); app.RegisterEndpoints(); app.Run();
namespace MinimalBlog.Api.Features.Authors; public class AuthorModule : IModule { public IEndpointRouteBuilder RegisterEndpoints(IEndpointRouteBuilder endpoints) { endpoints.MapGet("/api/authors", async (MinimalBlogDbContext ctx) => { var authors = await ctx.Authors.ToListAsync(); return authors; }); endpoints.MapPost("/api/authors", async (MinimalBlogDbContext ctx, AuthorDto authorDto) => { var author = new Author(); author.FirstName = authorDto.FirstName; author.LastName = authorDto.LastName; author.Bio = authorDto.Bio; author.DateOfBirth = authorDto.DateOfBirth; ctx.Authors.Add(author); await ctx.SaveChangesAsync(); return author; }); return endpoints; } }
<Project Sdk="Microsoft.NET.Sdk.Web"> <ItemGroup> <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="11.0.0" /> <PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="10.0.1" /> </ItemGroup> </Project>
public static class ServiceCollectionExtensions { public static IServiceCollection AddApplicationServices(this IServiceCollection services, WebApplicationBuilder builder) { // ... builder.Services.AddMediatR(typeof(Program)); builder.Services.AddAutoMapper(typeof(Program)); return services; } }
using AutoMapper; using MinimalBlog.Domain.Model; namespace MinimalBlog.Api.Features.Authors; public class AuthorProfile : Profile { public AuthorProfile() { CreateMap<AuthorDto, Author>().ReverseMap(); } }
Button btn = FindViewById<Button>(Resource.Id.button1);
FindViewById<EditText>(Resource.Id.txtname).Text = "";
Intent _intent = new Intent(this, typeof(Activity2)); StartActivity(_intent);
Intent _intent = new Intent(this, typeof(Activity2)); string Test="Vlaueone"; _intent.PutExtra("mainactivity", Test); StartActivity(_intent);
string Getintent = Intent.GetStringExtra("mainactivity");
List<Product> products; products = new List<Product>(); Product p = new Product { name = FindViewById<EditText>(Resource.Id.mainedittextname).Text, price = Convert.ToInt32(FindViewById<EditText>(Resource.Id.mainedittextprice).Text) }; products.Add(p); Intent _intent = new Intent(this, typeof(Activity2)); _intent.PutExtra("products", JsonConvert.SerializeObject(products)); StartActivity(_intent);
var p = JsonConvert.DeserializeObject<List<Product>>(Intent.GetStringExtra("products")); foreach (var item in p) { Toast.MakeText(this, $" {item.name} , {item.price}", ToastLength.Long).Show(); };
//set alert for executing the task AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.SetTitle("Confirm delete"); alert.SetMessage("Lorem ipsum dolor sit amet, consectetuer adipiscing elit."); alert.SetPositiveButton("Delete", (senderAlert, args) => { Toast.MakeText(this, "Deleted!", ToastLength.Short).Show(); }); alert.SetNegativeButton("Cancel", (senderAlert, args) => { Toast.MakeText(this, "Cancelled!", ToastLength.Short).Show(); }); Dialog dialog = alert.Create(); dialog.Show();
public class DialogFragmentActivity : DialogFragment { public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { var dlg = inflater.Inflate(Resource.Layout.layoutDialog, container, false); return dlg; } }
DialogFragmentActivity dlg = new DialogFragmentActivity (); dlg.Show(this.FragmentManager, "Fragment");
public override void OnStart() { base.OnStart(); Dialog dialog = Dialog; if (dialog != null) { dialog.Window.SetLayout(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent); dialog.Window.SetBackgroundDrawable(new ColorDrawable(Color.Transparent)); } }
public override Dialog OnCreateDialog(Bundle savedInstanceState) { Dialog NotTitle = base.OnCreateDialog(savedInstanceState); NotTitle.Window.RequestFeature(WindowFeatures.NoTitle); return NotTitle; }
return $"/{uploadsFolder}/{file.Name}"
<img src="https://localhost:5001/uploads/name.png" />
<?xml version="1.0"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<assembly>
<name>SLHelper</name>
<version>1.0.0.0</version>
<publickeytoken>f265933def965412</publickeytoken>
<relpath>SLHelper.dll</relpath>
<extension downloadUri="SLHelper.zip" />
</assembly>
</manifest>
اگر به مبحث CQRS علاقمند هستید و میخواهید بطور کامل و درست اونو تو پروژههای خودتون پیاده سازی کنید و از پرفرمنس اپلیکیشن خود راضی باشید، ریپازیتوری ای را که معرفی میکنم، دنبال کنید.
یکی از مزایای CQRS ، Scalability است. بدون Scale کردن ، کل اپلیکیشن ما درون یک سرور قرار دارد و تنها به منابع یک سرور محدود میشود. با گذشت زمان و رشد اپلیکیشن منابع بیشتری مورد نیاز خواهد بود و باید این سرور را قویتر کنیم که این ماجرا هزینه بر است.
چونکه عملیات خواندن بیشتر از نوشتن، آپدیت و حذف اطلاعات درخواست میشود درنتیجه بار بیشتری روی کوریهای اپلیکیشن هست ، پس جداسازی دیتابیسهای Query و Command میتواند تاثیر چشمگیری در سرعت و کارایی اپلیکیشن شما داشته باشد.
بدین ترتیب میتوانیم برای عملیات Read ، سرور را قویتر و برای باقی عملیات از سرورهای ضعیفتر استفاده کنیم و این چیزی است که توسط Scalability فراهم میشود.
در این پروژه کانتکستها و ریپازیتوریهای خواندن و نوشتن جدا شده است و به این ترتیب میتونید در Query ها از کانتکست یا ریپازیتوری خواندن و در Command ها از کانتکست یا ریپازیتوری نوشتن استفاده کنید.
یک راه برای جداسازی دیتابیسهای خواندن و نوشتن استفاده از تکنیک Always On اسکول سرور است که بعد از پیاده سازی آن، شما میتوانید کانکشن استرینگهای دیتابیسهای خود را در فایل appsettings.json قرار داده و دیتابیس Command و Query اپلیکیشن خود را بدین ترتیب جدا سازی نمایید.
راه حل دیگر میتواند این باشد که در پیاده سازی ریپازیتوری خواندن خود از Dapper برای کوری گرفتن استفاده کنید که کارایی و سرعت آن در مواردی به مراتب بیشتر از ef است.
یک راه بهتر می تواند طراحی دیتابیسی باشد که جداول Denormal و Flat داشته باشد که تمام فیلدهای مورد نیاز درون آن قرارگیرد. سپس با هر بار درج اطلاعات در دیتابیس Command این جداول نیر آپدیت شوند. با داشتن این جداول دیگر نیاز به Join های عجیب و غریب SQL نداریم.
بسته به بیزینس مورد نظر و منابع موجود میتوانید از تکنیک ها، ابزارها و دیتابیسهای دیگری هم در پیاده سازیهای خود استفاده کنید.
import someModule from './dir/someModule.js';
import('./dir/someModule.js') .then(someModule => someModule.foo());
button.addEventListener('click', event => { import('./dialogBox.js') .then(dialogBox => { dialogBox.open(); }) .catch(error => { /* Error handling */ }) });
import('./myModule.js') .then(({export1, export2}) => { export1.run(); export2.fire(); });
Promise.all([ import('./module1.js'), import('./module2.js'), import('./module3.js'), ]) .then(([module1, module2, module3]) => { // code });
async function main() { const myModule = await import('./myModule.js'); myModule.getInfo(); const {export1, export2} = await import('./myModule.js'); export1.run(); export2.fire() } main();
البته آقای Jake Archibald کد جالبی را برای این قابلیت پیشنهاد دادهاست که ترکیبی از import استاتیک ES6 میباشد:
function importModule (url) { return new Promise((resolve, reject) => { const script = document.createElement("script"); const tempGlobal = "__tempModuleLoadingVariable" + Math.random().toString(32).substring(2); script.type = "module"; script.textContent = `import * as m from "${url}"; window.${tempGlobal} = m;`; script.onload = () => { resolve(window[tempGlobal]); delete window[tempGlobal]; script.remove(); }; script.onerror = () => { reject(new Error("Failed to load module script with URL " + url)); delete window[tempGlobal]; script.remove(); }; document.documentElement.appendChild(script); }); }
public interface IMyOperation { void DoIt(); }
public void DoIt() { Console.WriteLine( "this is main block of code" ); }
public class Logger { const string path = @"D:\Log.txt"; public static void WriteToFile( string methodName ) { object lockObject = new object(); if ( !File.Exists( path ) ) { File.Create( path ); } lock ( lockObject ) { using ( TextWriter writer = new StreamWriter( path , true ) ) { writer.WriteLine( string.Format( "{0} at {1}" , methodName , DateTime.Now ) ); } } } }
public class LogHandler : ICallHandler { public IMethodReturn Invoke( IMethodInvocation input , GetNextHandlerDelegate getNext ) { Logger.WriteToFile( input.MethodBase.Name ); var methodReturn = getNext()( input , getNext ); return methodReturn; } public int Order { get; set; } }
var methodReturn = getNext()( input , getNext );
public class LogAttribute : HandlerAttribute { public override ICallHandler CreateHandler( Microsoft.Practices.Unity.IUnityContainer container ) { return new LogHandler(); } }
var unityContainer = new UnityContainer(); unityContainer.AddNewExtension<Interception>(); unityContainer.Configure<Interception>().SetDefaultInterceptorFor<IMyOperation>( new InterfaceInterceptor() ); unityContainer.RegisterType<IMyOperation, MyOperation>();
var container = new UnityContainer(); container.RegisterType<Book , Book>(); container.AddNewExtension<Interception>(); var policy = container.Configure<Interception>().SetDefaultInterceptorFor<Book>( new VirtualMethodInterceptor() ).AddPolicy( "MyPolicy" ); policy.AddMatchingRule( new PropertyMatchingRule( "*" , PropertyMatchingOption.Set ) ); policy.AddCallHandler<Handler.NotifyChangedHandler>();