azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
ر پروژه خود از لایه Domain ، Services ، Data و ... استفاده میکردید و در تکنولوژی ارتباط با دیتابیس از EF code first بهره میبردید و مباحثی همچون Dependency injection و ... طبق نیاز در پروژه پیاده سازی میکردید توسعه پروژه خیلی آسان انجام میگرفت و برای خودکار کردن پروژه از دستگاههای RFID برای این که خودرو به محض ورود روی سکو به صورت خودکار شناسایی شود و از دوربینهای دیجیتال همراه پیاده سازی نرم افزاری برای تشخیص پلاک خودرو و ... استفاده میشد میتوانست پروژه موفق و اصولی باشد.
اندازهی قلم متن
نمایش کدهای طولانی
تخمین مدت زمان مطالعهی مطلب: ده دقیقه
در قسمت قبلی نحوه کانفیگ اولیه برنامه را به همراه نصب پلاگینهای مورد نیاز، بررسی نمودیم؛ در ادامه قصد داریم تا چندین کامپوننت , ^ را برای نمایش لیست فیلمها، جزییات فیلم و جستجو، به برنامه اضافه کنیم و به هر کدام یک route را نیز انتساب دهیم. از کامپوننتها برای بخش بندی قسمتهای مختلف سایت استفاده میکنیم. هر بخش برای دریافت و نمایش اطلاعاتی خاص مورد استفاده قرار میگیرد. بر خلاف Angular که بهراحتی با دستور زیر میتوان برای آن یک کامپوننت ایجاد نمود و هر بخشی (css,js,ts,html) را در یک فایل جداگانه قرار داد:
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
ng generate component [name]
یا
ng g c [name]
در Vue.js هنوز امکان اینکه بتوان از طریق cli یک کامپوننت را ایجاد کرد، فراهم نشدهاست. البته پکیجهایی برای اینکار تدارک دیده شدهاند، ولی در این مقاله بهصورت دستی اینکار انجام میشود و از Single File Component استفاده میکنیم. بصورت پیش فرض برنامه ایجاد شده vue.js دارای یک کامپوننت با نام HelloWorld.vue در پوشه components میباشد ( چیزی شبیه Hello Dolly در Wordpress)؛ آن را حذف میکنیم و محتویات فایل App.vue را مطابق زیر تغییر میدهیم ( قسمت import کردن کامپوننت HelloWorld.vue را حذف میکنیم)
Code
در پوشه components، سه کامپوننت را با نامهای LatestMovie.vue ، Movie.vue و SearchMovie.vue ایجاد کنید.
محتویات LatestMovie.vue
Code
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
محتویات Movie.vue
Code
محتویات SearchMovie.vue
Code
توضیحی درباره کدهای بالا
برای درخواستهای ایجکس از axios استفاده میکنیم و با توجه به اینکه در این برنامه سه کامپوننت داریم، باید در هر کامپوننت axios را import کنیم:
import axios from 'axios'
لذا (DRY) یک فولدر را بنام service در پوشه src ایجاد میکنیم. یک فایل جاوااسکریپتی را نیز با نام دلخواهی در آن ایجاد و فقط یکبار axios را در آن import میکنیم و توابع مورد نیاز را در آنجا مینویسیم (هر چند راههای بهتر دیگری هم برای کار با axios هست که در حیطه مقاله جاری نیست).
محتویات فایل MovieApi.js در پوشه service
import axios from 'axios'
export default {
fetchMovieCollection (name) {
return axios.get('&s=' + name)
.then(response => {
return response.data
})
},
fetchSingleMovie (id) {
return axios.get('&i=' + id)
.then(response => {
return response.data
})
}
}azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
فایل main.js برنامه را بشکل زیر تغییر میدهیم و با استفاده از تنظیماتی که برای axios وجود دارد، آدرس baseURL آن را به ازای نمونه وهله سازی شدهی vue برنامه، تنظیم میکنیم.
axios.defaults.baseURL = 'http://www.omdbapi.com/?apikey=b76b385c&page=1&type=movie&Content-Type=application/json'
فایل index.js درون پوشه router را باز میکنیم و محتویات آن را بشکل زیر تغییر میدهیم:
Code
در برنامه ما سه کامپوننت وجود دارد. ما برای هر کدام یک مسیر و نام را برای route آنها تعریف میکنیم، تا بتوانیم با آدرس مستقیم، آنها را فراخوانی کنیم و با دکمههای back و forward مرورگر کار کنیم.
کد کامل برنامه
نکته: برای اجرای برنامه و دریافت پکیجهای مورد استفاده در مثال جاری، نیاز است دستور زیر را اجرا کنید:
npm install
توسط کامیاری کامیاری در دیروز شنبه، ساعت ۱۹:۳۵ مشاهده: ۶۶ نظرات : ۰
گروه(ها): JavaScript Vue.js
امتیاز ۵,۰۰ از ۵ توسط ۱ نفر info
ساخت یک سایت سادهی نمایش لیست فیلم با استفاده از Vue.js - قسمت اول
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
نمایش کدهای طولانی
تخمین مدت زمان مطالعهی مطلب: چهار دقیقه
Vue.js یکی از محبوب ترین فریم ورکهای SPA است و سایت جاری نیز دارای مقالات خوبی دربارهی Vue.js میباشد. قصد داریم طی چند مقاله با استفاده از Vue.js و چندین پلاگین مطرح آن، یک سایت سادهی نمایش فیلم را ایجاد کنیم. ابتدا Node.js را بر روی سیستم خود نصب کنید (پیشنهاد ما نسخهی LTS میباشد). مراحل نصب آن ساده است و بصورت Nextهایی پی در پی میباشد؛ بصورت پیش فرض npm نیز همراه آن نصب میشود. سپس دو دستور زیر را جهت صحت انجام مراحل نصب، تست نمایید.
در این مقاله با ادیتور VS Code کار میکنیم. بعد از نصب آن، از منوی Terminal، گزینهی New Terminal را کلیک کنید تا پنجرهی PowerShell نمایش داده شود؛ برای سرعت و دقت بیشتر در برنامههای vue.js ای. با دستور زیر vue cli را نصب میکنیم (فقط یک مرتبه و برای برنامههای بعدی vue.jsای، نیازی به اجرای این دستور نداریم):
npm install -g @vue/cli
جهت راه اندازی یک برنامهی پیش فرض Vue.js ای، کافیست دستور زیر را اجرا نماییم تا پکیجهای مورد نیاز، به همراه کانفیگ اولیه (Zero config) برای ما ایجاد شوند:
vue create movie-app
بعد از ایجاد برنامه در vs code، از طریق منوی File، گزینه Open Folder را کلیک کرده و پوشه برنامهای را که ایجاد کردیم، Select Folder میکنیم. ساختار اولیهی برنامهی ایجاد شده، به شکل زیر میباشد:
نیازمندیهای مثال جاری
A) برای گرفتن اطلاعات مورد نمایش در مثال جاری، از سایت omdbapi.com استفاده میکنیم که با دریافت یک api key آن بصورت رایگان، میتوانیم web serviceهای آن را Call نماییم.
B) از vuetify برای ui استفاده میکنیم که بصورت Material Design و دارای کامپوننتهای غنی میباشد؛ ضمن اینکه RTL را هم پشتیبانی میکند.
برای نصب آن در Terminal دستور زیر را اجرا میکنیم:
vue add vuetify
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
سپس جهت تست و صحت افزوده شدن و کانفیگ درست، با دستور زیر برنامه را اجرا میکنیم:
npm run serve
بعد از اجرای دستور فوق، روی گزینه زیر ctrl+click میکنیم تا نتیجه کار در مرورگر قابل رویت باشد:
نمایش صفحه زیر نشان دهندهی درستی انجام کار تا اینجا است:
نکته: جهت استفاده از امکان RTL کافیست در فایل vuetify.js واقع در پوشهی plugins، تغییرات زیر را انجام دهیم. در مثال جاری بدلیل اینکه اطلاعات انگلیسی میباشند، از نسخه LTR آن استفاده میکنیم؛ هر چند یکسری api فارسی نیز موجود میباشد که میتوان از آنها استفاده نمود.
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import 'vuetify/src/stylus/app.styl'
Vue.use(Vuetify, {
iconfont: 'md',
rtl: true
})
C) نصب vue-router : جهت انجام routeهای تودرتو ، مپ کردن کامپوننت ها با آدرسی مشخص، کار با پارامتر و HTML5 History API مورد استفاده قرار میگیرد. برای نصب آن، دستور زیر را اجرا میکنیم:
npm install vue-router
برای نوشتن routeهای مورد نیاز، یک فولدر را با نام router، در پوشه src برنامه ایجاد میکنیم و یک فایل جاوا اسکریپتی را در آن با نام index.js، میسازیم (این ساختار برای مدیریت بهتر پروژه میباشد):
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
درون فایل index.js، محتویات زیر را طبق مستندات آن قرار میدهیم:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
جهت استفاده از این router، نیاز است تا در نمونهی وهله سازی شدهی vue برنامه بکار گرفته شود. فایل main.js را باز کنید و خط زیر را در قسمت بالای برنامه وارد کنید:
import router from './router'
اکنون محتویات فایل main.js بشکل زیر میباشد:
import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
new Vue({
render: h => h(App),
router
}).$mount('#app')
D) نصب axios : برای انجام درخواستهای HTTP و عملیات ایجکس در vue.js ترجیحا بهتر است از axios که یک کتابخانهی محبوب میباشد و کار با آن ساده است، استفاده شود. برای نصب آن، دستور زیر را اجرا میکنیم:
npm install axios
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
E) نصب vuex : کتابخانهای جهت مدیریت حالت (state management) برای vue.js میباشد و مشابه آن Flux و Redux برای React میباشند. برای نصب، دستور زیر را اجرا میکنیم:
npm install vuex
برای بکارگیری آن یک فولدر را با نام store در پوشهی src برنامه ایجاد میکنیم و یک فایل جاوا اسکریپتی را در آن با نام index.js میسازیم (این ساختار برای مدیریت بهتر پروژه میباشد). درون فایل index.js، محتویات زیر را طبق مستندات آن و ^ قرار میدهیم.
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store()
برای استفاده و کانفیگ آن، محتویات فایل main.js را بشکل زیر تغییر دهید:
import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import router from './router'
import {store} from './store'
Vue.config.productionTip = false
new Vue({
render: h => h(App),
store,
router
}).$mount('#app')
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
دریافت کد قسمت اول
نکته: برای اجرای برنامه و دریافت پکیجهای مورد استفاده در مثال جاری، نیاز است دستور زیر را اجرا کنید:
npm install
توسط کامیاری کامیاری در ۱ روز قبل، جمعه ۱۷ خرداد ۱۳۹۸، ساعت ۱۳:۰۰ مشاهده: ۲۷۸ نظرات : ۱
گروه(ها): JavaScript Vue.js
امتیاز ۵,۰۰ از ۵ توسط ۱۳ نفر info
چگونه از دو نگارش مختلف یک اسمبلی در برنامههای NET Core. استفاده کنیم؟
اندازهی قلم متن
نمایش کدهای طولانی
تخمین مدت زمان مطالعهی مطلب: سه دقیقه
فرض کنید اسمبلی A که System.Drawing.Common، نام دارد، فضای نام System.Drawing.Common را ارائه میدهد و اسمبلی B که CoreCompact.System.Drawing نام دارد، باز هم دقیقا همان فضای نام را ارائه میدهد. سؤال: آیا میتوان از این دو اسمبلی مختلف در برنامهی خود استفاده کرد؟ یا مثال دیگر آن داشتن دو اسمبلی با نگارشهای مختلف، از یک کتابخانه است. برای مثال یکی بر اساس netcoreapp2.1 تهیه شدهاست و دیگری بر اساس netstandard2.0 و به هر دلیلی نیاز است که بتوان از هر دو اسمبلی در برنامهی خود استفاده کرد. برای یک چنین مواردی در زبان #C ویژگی به نام extern alias وجود دارد که با مثالی نحوهی کار با آنرا بررسی خواهیم کرد.
ایجاد پروژهی Globe1
پروژهی کتابخانهی Globe1 را بر اساس netcoreapp2.1 به این صورت توسط فایلهای زیر ایجاد میکنیم:
الف) فایل Globe1.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
</Project>
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
ب) فایل Globe.cs
using System;
namespace Space
{
public class Globe
{
public string GetColor() => "Blue";
}
}
ایجاد پروژهی Globe2
پروژهی کتابخانهی Globe2 را بر اساس netstandard2.0 به این صورت توسط فایلهای زیر ایجاد میکنیم:
الف) فایل Globe2.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
ب) فایل Globe.cs
using System;
namespace Space
{
public class Globe
{
public string GetColor() => "Green";
}
}
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
ایجاد یک پروژهی کنسول استفاده کنندهی از این اسمبلیها
همانطور که ملاحظه میکنید اگر این دو پروژهی class library را کامپایل کنیم، به دو فایل dll یا اسمبلی خواهیم رسید که هر دو دارای فضای نام Space و همچنین کلاس Globe هستند. اما نگارشهای آنها و یا TargetFrameworkهای آنها متفاوت است. اکنون میخواهیم از هر دوی اینها در یک پروژهی Console استفاده کنیم. بنابراین ابتدا این پروژه را با ایجاد فایل csproj آن شروع میکنیم:
الف) فایل Owl.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Reference Include="Globe1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\Globe1\bin\$(Configuration)\netcoreapp2.1\Globe1.dll</HintPath>
<Aliases>Lib1</Aliases>
</Reference>
<Reference Include="Globe2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\Globe2\bin\$(Configuration)\netstandard2.0\Globe2.dll</HintPath>
<Aliases>Lib2</Aliases>
</Reference>
</ItemGroup>
</Project>
روش ارجاع دهی به این اسمبلیها، اندکی متفاوت است. در اینجا نام هر کدام به همراه شماره نگارش آنها ذکر شدهاست. همچنین مسیر یافتن فایلهای Globe1.dll و Globe2.dll نیز ذکر شدهاند؛ بجای اینکه ارجاعی را به فایلهای csproj این class libraryها اضافه کنیم (از این جهت که ممکن است مانند مثال ابتدای بحث، صرفا دو فایل dll را بیشتر در اختیار نداشته باشیم). به علاوه یک Alias نیز برای هر کدام تعریف شدهاست تا توسط آن بتوان به امکانات هرکدام دسترسی یافت. وجود این Alias از این جهت ضروری است که هرچند دو فایل dll مختلف را داریم، اما فضاهای نام و کلاسهای آنها، نامهای مشابهی دارند و قابل تمیز از یکدیگر نیستند.
ب) فایل Program.cs
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
اکنون قسمت مهم این فایل، همان extern aliasهایی هستند که پیشتر تعریف کردیم:
extern alias Lib1;
extern alias Lib2;
using System;
using SpaceOne = Lib1::Space;
using SpaceTwo = Lib2::Space;
namespace Owl
{
class Program
{
static void Main(string[] args)
{
var owl = new SuperOwl();
owl.IntegrateGlobe(new SpaceOne.Globe());
owl.IntegrateGlobe(new SpaceTwo.Globe());
Console.WriteLine(owl.GetGLobeColors());
}
}
public class SuperOwl
{
private SpaceOne.Globe _firstGlobe;
private SpaceTwo.Globe _secondGlobe;
public void IntegrateGlobe(SpaceOne.Globe globe) => _firstGlobe = globe;
public void IntegrateGlobe(SpaceTwo.Globe globe) => _secondGlobe = globe;
public string GetGLobeColors() => $"First: {_firstGlobe.GetColor()}, Second: {_secondGlobe.GetColor()}";
}
}
ابتدا extern aliasها تعریف میشوند:
azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
extern alias Lib1;
extern alias Lib2;
سپس بر اساس هر Alias میتوان یک فضای نام جدید را بجای فضای نام Space فعلی هرکدام تعریف کرد:
using SpaceOne = Lib1::Space;
using SpaceTwo = Lib2::Space;
تا بتوان به متدهای GetColor متفاوت اینها دسترسی یافت.
اگر این برنامه را اجرا کنیم، چنین خروجی حاصل میشود:
First: Blue, Second: Green
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید: alias.zip
توسط 09367292276 09367292276 در ۲ روز قبل، پنج شنبه ۱۶ خرداد ۱۳۹۸، ساعت ۱۴:۰۰ مشاهده: ۱۳۸ نظرات : ۰
گروه(ها): C# .NET Core
امتیاز ۵,۰۰ از ۵ توسط ۱۵ نفر info
C# 8.0 - Async Streams
اندازهی قلم متن
نمایش کدهای طولانی
تخمین مدت زمان مطالعهی مطلب: سه دقیقه
امکان تعریف نوعهای شمارشی async در C# 8.0
فرض کنید قصد دارید یک متد async از نوع IEnumerable را که تعدادی yield return به تاخیر افتاده را به همراه دارد (yield returnها فقط زمانی اجرا میشوند که بر روی آنها متدهایی مانند ToList و یا حلقهی foreach اجرا شوند) و همچنین توسط await Task.Delay، دریافت اطلاعات به صورت async را نیز شبیه سازی میکند، تهیه کنید:
public struct Statement
{
public int Id { get; }
public string Description { get; }
public Statement(int id, string description) => (Id, Description) = (id, description);
public override string ToString() => Description;
}azsoftir.com
09367292276
09367292276
azsoftir@gmail.com
azsoftir.com
09367292276
09367292276
public static async Task<IEnumerable<Statement>> GetStatements(bool error)
{
if (error)
{
throw new Exception("Oops, we messed up