اشتراکها
با سلام؛ دستور ایجاد وب سرویس ویندوزی فکر میکنم درستش با sc شروع بشه؛ یعنی به این شکل :
sc create WorkerServiceDemo binPath=C:\Path\To\WorkerServiceDemo.exe
نظرات مطالب
امکان ساخت قالب برای پروژههای NET Core.
بله از آخرین نسخه استفاده میکنم مشکلی که وجود داره اینه که پس از نصب قالب و ورود به پوشه جدید برای ایجاد قالب جدید وقتی دستور
dotnet new --list رو اجرا میکنم دیگه قالب نصب شده در لیست قالبهای موجود نیست
ارتقاء به NET Core 3.0.: پشتیبانی از ایجاد سرویسهای پسزمینه
یکی از تغییرات مهم قالب ایجاد پروژههای ASP.NET Core 3.0، تغییر فایل program.cs آن است که در آن از یک Generic Host بجای روش قبلی Web Host، استفاده شدهاست. علت آن فراهم آوردن امکان استفادهی از قابلیتهایی مانند تزریق وابستگیها، logging، تنظیمات برنامه و غیره، در برنامههای غیر وب نیز میباشد. یکی از این انواع برنامهها، سرویسهای پسزمینهی غیر HTTP هستند. به این ترتیب میتوان برنامهای شبیه به یک برنامهی وب ASP.NET Core را ایجاد کرد که تنها کارش اجرای سرویسهای غیر وبی است؛ اما به تمام امکانات و زیر ساختهای ASP.NET Core دسترسی دارد.
برای ایجاد این نوع برنامهها در NET Core 3x. میتوانید دستور زیر را در پوشهی خالی که ایجاد کردهاید، اجرا کنید:
ساختار برنامهای که توسط این دستور تولید میشود به صورت زیر است که بسیار شبیه به ساختار یک برنامهی ASP.NET Core است:
appsettings.Development.json
appsettings.json
MyWorkerServiceApp.csproj
Program.cs
Worker.cs
- فایل csproj آن دارای این محتوا است:
در آن ویژگی Sdk به Microsoft.NET.Sdk.Worker اشاره میکند و همچنین از بستهی Microsoft.Extensions.Hosting استفاده شدهاست.
- محتوای فایل Program.cs آن بسیار آشنا است و دقیقا کپی همان فایلی است که در برنامههای ASP.NET Core 3x حضور دارد:
در اینجا یک Generic host را بجای Web host قالبهای پیشین فایل Program.cs ملاحظه میکنید که هدف اصلی آن، عمومی کردن این قالب، برای استفادهی از آن در برنامههای غیر وبی نیز میباشد.
در متد ConfigureServices، انواع اقسام سرویسها را منجمله یک HostedService که در مطلب جاری به آن پرداخته شده، میتوان افزود. سرویس Worker ای که در اینجا به آن ارجاعی وجود دارد، به صورت زیر تعریف شدهاست:
با ساختار این کلاس نیز آشنا هستید و موضوع اصلی مطلب جاری است.
یک نکتهی تکمیلی: روش تبدیل کردن یک BackgroundService به یک Windows Service
اگر برنامهی NET Core. شما در ویندوز اجرا میشود، میتوانید این برنامهی BackgroundService را به یک سرویس ویندوز NT نیز تبدیل کنید. برای اینکار ابتدا بستهی نیوگت Microsoft.Extensions.Hosting.WindowsServices را به پروژه اضافه کنید. سپس جائیکه CreateHostBuilder صورت میگیرد، متد UseWindowsService را فراخوانی کنید:
یکی از تغییرات مهم قالب ایجاد پروژههای ASP.NET Core 3.0، تغییر فایل program.cs آن است که در آن از یک Generic Host بجای روش قبلی Web Host، استفاده شدهاست. علت آن فراهم آوردن امکان استفادهی از قابلیتهایی مانند تزریق وابستگیها، logging، تنظیمات برنامه و غیره، در برنامههای غیر وب نیز میباشد. یکی از این انواع برنامهها، سرویسهای پسزمینهی غیر HTTP هستند. به این ترتیب میتوان برنامهای شبیه به یک برنامهی وب ASP.NET Core را ایجاد کرد که تنها کارش اجرای سرویسهای غیر وبی است؛ اما به تمام امکانات و زیر ساختهای ASP.NET Core دسترسی دارد.
برای ایجاد این نوع برنامهها در NET Core 3x. میتوانید دستور زیر را در پوشهی خالی که ایجاد کردهاید، اجرا کنید:
dotnet new worker
appsettings.Development.json
appsettings.json
MyWorkerServiceApp.csproj
Program.cs
Worker.cs
- فایل csproj آن دارای این محتوا است:
<Project Sdk="Microsoft.NET.Sdk.Worker"> <PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <UserSecretsId>dotnet-MyWorkerServiceApp-B76DB08E-FFBB-4AD1-89B5-93BF483D1BD0</UserSecretsId> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.0-preview8.19405.4" /> </ItemGroup> </Project>
- محتوای فایل Program.cs آن بسیار آشنا است و دقیقا کپی همان فایلی است که در برنامههای ASP.NET Core 3x حضور دارد:
namespace MyWorkerServiceApp { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); } }
در متد ConfigureServices، انواع اقسام سرویسها را منجمله یک HostedService که در مطلب جاری به آن پرداخته شده، میتوان افزود. سرویس Worker ای که در اینجا به آن ارجاعی وجود دارد، به صورت زیر تعریف شدهاست:
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
یک نکتهی تکمیلی: روش تبدیل کردن یک BackgroundService به یک Windows Service
اگر برنامهی NET Core. شما در ویندوز اجرا میشود، میتوانید این برنامهی BackgroundService را به یک سرویس ویندوز NT نیز تبدیل کنید. برای اینکار ابتدا بستهی نیوگت Microsoft.Extensions.Hosting.WindowsServices را به پروژه اضافه کنید. سپس جائیکه CreateHostBuilder صورت میگیرد، متد UseWindowsService را فراخوانی کنید:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices((hostContext, services) => { //services.AddHttpClient(); services.AddHostedService<Worker>(); });
تا اینجا هنوز هم برنامه، شبیه به یک برنامهی کنسول دات نت Core قابل اجرا و دیباگ است. اما اگر خواستید آنرا به صورت یک سرویس ویندوز نیز نصب کنید، تنها کافی است از دستور زیر استفاده کنید:
cs create WorkerServiceDemo binPath=C:\Path\To\WorkerServiceDemo.exe
البته برای لینوکس نیز میتوان از UseSystemd استفاده کرد که نیاز به نصب بستهی Microsoft.Extensions.Hosting.Systemd را دارد:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSystemd() .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); });
روش استفاده از TypeScript در پروژههای Blazor
شاید علاقمند باشید تا اسکریپتهای مورد نیاز یک پروژهی Blazor را با TypeScript تهیه کنید؛ تا از مزایای بررسی نوعها، intellisense قوی، null checking و غیره بهرهمند شوید و سپس توسط کامپایلر آن، حاصل را به کدهای نهایی js تبدیل کنید. برای اینکار میتوان مراحل زیر را طی کرد:
الف) تهیه فایل تنظیمات کامپایلر TypeScript
نیاز است فایل tsconfig.json را در ریشهی پروژه، جائیکه فایل csproj قرار دارد، با محتوای زیر ایجاد کرد:
{ "compilerOptions": { "strict": true, "removeComments": false, "sourceMap": false, "noEmitOnError": true, "target": "ES2020", "module": "ES2020", "outDir": "wwwroot/scripts" }, "include": [ "Scripts/**/*.ts" ], "exclude": [ "node_modules" ] }
ب) فعالسازی کامپایلر TypeScript به ازای هر بار build برنامه
برای اینکار نیاز است فایل csproj را به صورت زیر تکمیل کرد:
<Project Sdk="Microsoft.NET.Sdk.Razor"> <ItemGroup> <PackageReference Include="Microsoft.TypeScript.MSBuild" Version="4.3.5"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup> <ItemGroup> <Content Remove="tsconfig.json" /> </ItemGroup> <ItemGroup> <TypeScriptCompile Include="tsconfig.json"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> </TypeScriptCompile> </ItemGroup> </Project>
ج) یک مثال از تبدیل کدهای js به ts
فرض کنید کدهای سراسری زیر را داریم که به شیء window اضافه شدهاند:
window.exampleJsFunctions = { showPrompt: function (message) { return prompt(message, 'Type anything here'); } };
namespace JSInteropWithTypeScript { export class ExampleJsFunctions { public showPrompt(message: string): string { return prompt(message, 'Type anything here'); } } } export function showPrompt(message: string): string { var fns = new JSInteropWithTypeScript. ExampleJsFunctions(); return fns.showPrompt(message); }
د) روش استفاده از خروجی کامپایل شدهی TypeScript در کامپوننتهای Blazor
پس از کامپایل قطعه کد فوق، ابتدا مسیر قابل دسترسی به فایل js قرار گرفته شده در پوشهی wwwroot را مشخص میکنیم که همواره با الگوی زیر است. همچنین اینبار IJSObjectReference است که امکان دسترسی به export function یاد شده را میسر میکند:
private const string ScriptPath = "./_content/----namespace-here---/scripts/file.js"; private IJSObjectReference scriptModule;
protected override async Task OnAfterRenderAsync(bool firstRender) { if (scriptModule == null) scriptModule = await JSRuntime.InvokeAsync<IJSObjectReference>("import", ScriptPath);
await scriptModule.InvokeVoidAsync("exported fn name", params);
- ابتدا باید این کامپوننت، IAsyncDisposable را پیاده سازی کند:
public partial class MyComponent : IAsyncDisposable
public async ValueTask DisposeAsync() { if (scriptModule != null) { await scriptModule.DisposeAsync(); } }
بازخوردهای دوره
استفاده از StructureMap به عنوان یک IoC Container
درود؛ من دارم از C# ( WPF) استفاده میکنم. میخوام از StructureMap استفاده کنم ولی هر کاری میکنم خطا میده.
این کد منه
پیاده سازی UnitofWork طبق آموزشی که شما تو سایت گذاشته بودید در DBContext پیاده سازی کردم و الان داره این خطا رو به من میده.
نمیتونه اینو پیدا کنه :
مشکل چیه ؟ باید چکار کنم؟
این کد منه
private static Container defaultContainer() { var container = new Container(ioc => { // map same interface to different concrete classes ioc.For<IUser>().Use<EFUserService>(); ioc.For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<ApplicationDBContext>(); }); container.AssertConfigurationIsValid(); return container; }
نمیتونه اینو پیدا کنه :
.HybridHttpOrThreadLocalScoped()
بازخوردهای دوره
تزریق خودکار وابستگیها در برنامههای ASP.NET MVC
این خطا یعنی تنظیمات اولیه ناقصی دارید. مراجعه کنید به مطلب «استفاده از StructureMap به عنوان یک IoC Container» برای توضیحات بیشتر در مورد نحوه تعریف ObjectFactory.Initialize و ارتباط دادن اینترفیسها به کلاسهای متناظر.
نظرات اشتراکها
کتاب NET Microservices.
چند مدتی است که Micro Service و Container ترند شده. خواندن کتاب قاعدتا برای دوستانی که علاقمند به هماهنگی با ترندها هستند مفید خواهد بود.
اشتراکها