معرفی ASP.NET Identity
بررسی تغییرات ASP.NET MVC 5 beta1
مجوز WTFPL
آموزش سیلورلایت 4 - قسمتهای 1 تا 5
http://silverlightrtl.codeplex.com
http://persiansilverlight.codeplex.com/
WCF
- مقایسهای کوتاه بین WCF و ASMX
- نحوه استفاده از TransactionFlow در WCF
- مدیریت Instance در WCF
- WCF Method Overloading
- مدیریت تغییرات در سیستمهای مبتنی بر WCF
- آشنایی با KnownTypeAttribute در WCF
- Data Contracts and Circular References
- استفاده از Lambda Expression در پروژههای مبتنی بر WCF
- فراخوانی سرویسهای WCF به صورت Async
- مقایسه بین Proxy و ChannelFactory در WCF
- بررسی متدهای یک طرفه در WCF
- Message Header سفارشی در WCF
- MTOM در WCF
- اعتبارسنجی سرویسهای WCF
- تغییر فضای نام کلاس poco استفاده شده در WCF و از کار افتادن برنامهی مشتری بدون دریافت پیام خطا
- پیاده سازی ServiceHostFactory سفارشی در WCF
- پیاده سازی InstanceProvider برای سرویسهای WCF
- Long Polling در WCF
- Routing Service در WCF
- فیلترها در WCF Routing Service
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 1
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 2
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 3
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 4
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 5
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 6
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 7
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 8
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 9
- ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 10
آموزش Prism #3
تفاوتهای پیاده سازی مثال پست قبلی با این پست:
- در مثال قبل پروژه به صورت Desktop و با WPF پیاده سازی شده بود ولی در این مثال با Silverlight میباشد؛
- در مثال قبل از UnityBootstrapper استفاده شده بود ولی در این مثال از MefBootstrapper؛
- در مثال قبل هر View در یک ماژول قرار داشت ولی در این مثال هر دو View را در یک ماژول قرار دادم؛
- در مثال قبل از Prism Libary 2.x استفاده شده بود ولی در این مثال از PrismLibrary 4.x؛
- و...
نکته : برای فهم بهتر مفاهیم، آشنایی اولیه با MEF و مفاهیمی نظیر Export و Import و AggregateCatalog و AssemblyCatalog نیاز است. در صورتی که با این مطالب آشنایی ندارید میتوانید از (^) شروع کنید.
برای شروع یک پروژه Silverlight ایجاد کنید. بعد از اضافه شدن دو پروژه Silverlight و Web، یک Silverlight Class Library جدید بسازید.
ابتدا یک Page ایجاد کنید و کدهای زیر را در آن کپی کنید.
<UserControl x:Class="Module1.Module1View1" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" FlowDirection="RightToLeft" FontFamily="Tahoma"> <StackPanel> <sdk:DataGrid Height="100"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="کد" Width="50" /> <sdk:DataGridTextColumn Header="عنوان" Width="200" /> <sdk:DataGridTextColumn Header="نویسنده" Width="150" /> </sdk:DataGrid.Columns> </sdk:DataGrid> <Button x:Name="NextViewButton" Width="150" Height="25" Foreground="Red" Background="Blue" Content="لیست طبقه بندی ها" /> </StackPanel> </UserControl>
[Export(typeof(Module1View1))] public partial class Module1View1 : UserControl { [Import] public IRegionManager TheRegionManager { private get; set; } public Module1View1() { InitializeComponent(); NextViewButton.Click += NextViewButton_Click; } void NextViewButton_Click(object sender, RoutedEventArgs e) { TheRegionManager.RequestNavigate ( "MyRegion1", new Uri("Module1View2", UriKind.Relative), a => { } ); } }
حال یک Page دیگر برای طبقه بندی کتابها ایجاد کنید و کدهای زیر را در آن کپی کنید.
<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="Module1.Module1View2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" FlowDirection="RightToLeft" FontFamily="Tahoma"> <StackPanel> <sdk:DataGrid Height="100"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="کد" Width="150"/> <sdk:DataGridTextColumn Header="عنوان" Width="150"/> </sdk:DataGrid.Columns> </sdk:DataGrid> <Button x:Name="NextViewButton" Width="150" Height="25" Foreground="Green" Background="Yellow" Content="لیست کتاب ها" /> </StackPanel> </UserControl>
using Microsoft.Practices.Prism.Regions; using System; using System.ComponentModel.Composition; using System.Windows; using System.Windows.Controls; namespace Module1 { [Export] public partial class Module1View2 : UserControl { IRegion _region1; [ImportingConstructor] public Module1View2( [Import] IRegionManager regionManager ) { InitializeComponent(); ViewModel viewModel = new ViewModel(); DataContext = viewModel; viewModel.ShouldNavigateFromCurrentViewEvent += () => { return true; }; _region1 = regionManager.Regions["MyRegion1"]; NextViewButton.Click += NextViewButton_Click; } void NextViewButton_Click( object sender, RoutedEventArgs e ) { _region1.RequestNavigate ( new Uri( "Module1View1", UriKind.Relative ), a => { } ); } } }
نکته: اگر یک کلاس، سازنده با پارامتر داشته باشد باید با استفاده از ImportingConstructor حتما سازنده مورد نظر را هنگام وهله سازی مشخص کنیم در غیر این صورت با Exception مواجه خواهید شد.
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.ComponentModel.Composition; using Microsoft.Practices.Prism.Regions; namespace Module1 { public class ViewModel : IConfirmNavigationRequest { public event Func<bool> ShouldNavigateFromCurrentViewEvent; public bool IsNavigationTarget( NavigationContext navigationContext ) { return true; } public void OnNavigatedTo( NavigationContext navigationContext ) { } public void OnNavigatedFrom( NavigationContext navigationContext ) { } public void ConfirmNavigationRequest( NavigationContext navigationContext, Action<bool> continuationCallback ) { bool shouldNavigateFromCurrentViewFlag = false; if ( ShouldNavigateFromCurrentViewEvent != null ) shouldNavigateFromCurrentViewFlag = ShouldNavigateFromCurrentViewEvent(); continuationCallback( shouldNavigateFromCurrentViewFlag ); } } }
- IsNavigateTarget : برای تعیین اینکه آیا کلاس پیاده سازی کننده اینترفیس، میتواند عملیات راهبری را مدیریت کند یا نه.
- OnNavigateTo : زمانی عملیات راهبری وارد View شود(بهتره بگم View مورد نظر در Region صفحه لود شود) این متد فراخوانی میشود.
- OnNavigateFrom : زمانی که راهبری از این View خارج میشود (View از حالت لود خارج میشود) این متد فراخوانی خواهد شد.
- ConfirmNavigationRequest : برای تایید عملیات راهبری توسط کلاس پیاده سازی کننده اینترفیس استفاده میشود.
using Microsoft.Practices.Prism.MefExtensions.Modularity; using Microsoft.Practices.Prism.Modularity; using Microsoft.Practices.Prism.Regions; using System.ComponentModel.Composition; namespace Module1 { [ModuleExport(typeof(Module1Impl))] public class Module1Impl : IModule { [Import] public IRegionManager TheRegionManager { private get; set; } public void Initialize() { TheRegionManager.RegisterViewWithRegion("MyRegion1", typeof(Module1View1)); TheRegionManager.RegisterViewWithRegion("MyRegion1", typeof(Module1View2)); } } }
در متد Initialize برای RegionManager دو View ساخته شده را رجیستر کردیم. این کار باید به تعداد Viewهای موجود در ماژول انجام شود.
در پروژه اصلی بک Page به نام Shell ایجاد کنید و کدهای زیر را در آن کپی کنید.
<UserControl x:Class="NavigationViaViewModel.Shell" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://www.codeplex.com/prism" FlowDirection="RightToLeft" FontFamily="Tahoma"> <Grid x:Name="LayoutRoot" Background="White"> <TextBlock Text="لیست کتابها به همراه طبقه بندی آن ها" FontSize="19" Foreground="Black" HorizontalAlignment="Center" VerticalAlignment="Top" /> <ContentControl HorizontalAlignment="Center" VerticalAlignment="Center" prism:RegionManager.RegionName="MyRegion1" /> </Grid> </UserControl>
حال نیاز به یک Bootstrapper داریم. برای این کار یک کلاس به نام TheBootstrapper بسازید:
using Microsoft.Practices.Prism.MefExtensions; using Microsoft.Practices.Prism.Modularity; using System.ComponentModel.Composition.Hosting; using System.Windows; namespace NavigationViaViewModel { public class TheBootstrapper : MefBootstrapper { protected override void InitializeShell() { base.InitializeShell(); Application.Current.RootVisual = (UIElement)Shell; } protected override DependencyObject CreateShell() { return Container.GetExportedValue<Shell>(); } protected override void ConfigureAggregateCatalog() { base.ConfigureAggregateCatalog(); AggregateCatalog.Catalogs.Add(new AssemblyCatalog(this.GetType().Assembly)); } protected override IModuleCatalog CreateModuleCatalog() { ModuleCatalog moduleCatalog = new ModuleCatalog(); moduleCatalog.AddModule ( new ModuleInfo { InitializationMode = InitializationMode.WhenAvailable, Ref = "Module1.xap", ModuleName = "Module1Impl", ModuleType = "Module1.Module1Impl, Module1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" } ); return moduleCatalog; } } }
متد ConfigureAggregateCatalog برای مدیریت کاتالوگها و ماژولها که هر کدام در یک اسمبلی جدا وجود خواهند شد استفاده میشود. در این متد من از AssemblyCatalog استفاده کردم. AssemblyCatalog تمام کلاس هایی که ExportAttribute را به همراه دارند شناسایی میکند و آنها را در Container نگهداری خواهد کرد(^). مانند یک ServiceLocator در Microsoft unity Service Locator(^) .
متد آخر به نام CreateModuleCatalog است و باید در آن تمام ماژولهای برنامه را به کلاس ModuleCatalog اضافه کنیم. در مثال پست قبلی به دلیل استفاده از UnityBootstrapper باید این کار را از طریق BuildEvent ها مدیریت میکردیم ولی در این جا Mef به راحتی این کار را انجام خواهد داد.
تغییرات زیر را در فایل App.Xaml قرار دهید و پروژه را اجرا کنید.
public partial class App : Application { public App() { this.Startup += this.Application_Startup; InitializeComponent(); } private void Application_Startup(object sender, StartupEventArgs e) { var bootstrapper = new TheBootstrapper(); bootstrapper.Run(); } }
دریافت سورس پروژه
ادامه دارد..
- جذب
- انتخاب یا گزینش
مرحله جذب:
این مرحله مربوط است به آگهی استخدام و چگونگی تشریح مسایل و شرایط به گونه ای که فرد متقاضی را راغب به ارسال رزومه یا نمونه کار نماید. این مرحله مهمتر از مرحله انتخاب است؛ به دلیل اینکه اگر نتوانیم متقاضیان کار را جذب کنیم، دامنه انتخاب بین افراد متقاضی کاهش پیدا میکند و گاهی مجبور خواهیم شد بین گزینههای بد و بدتر، بد را انتخاب نماییم.
مرحله انتخاب:
این مرحله برای گزینش افراد است که همگان از آن به عنوان مرحله مصاحبه یاد میکنند که مورد بحث ما نیست.
مواردی که در آگهی استخدام شرکت دلفین رعایت شده بود:
»ذکر نام شرکت
اولین مورد که در بسیاری از آگهیهای استخدام رعایت نمیشود عدم ذکر نام شرکت است. دیده میشود در آگهیها بیشتر از عناوینی نظیر "یک شرکت معتبر نرم افزاری" یا "یک شرکت فعال در زمینه تولید نرم افزار" و... استفاده میکنند. ذکر نام شرکت از آن جهت مهم است که فرد متقاضی میتواند با یک جستجوی ساده در اینترنت (در صورتی که شرکت تقاضا دهنده یک وب سایت مناسب در این زمینه داشته باشد) بسیاری از اطلاعات مهم نظیر زمینه فعالیت شرکت ، مشتریان عمده شرکت ، محصولات تولید شده قبلی یا حتی آدرس شرکت (برای بررسی وضعیت رفت و آمد) را به دست بیاورد. در آگهی استخدام ذکر شده این مورد به خوبی رعایت شده بود.
»ذکر آدرس و شماره تماس:
دلیل اصلی برای ذکر آدرس شرکت صرفا برای بررسی وضعیت رفت و آمد از نظر شرایط ترافیک شهری و بعد مسافت یا حتی شرایط رفت و آمد با خودروی شخصی است که برای بیشتر متقاضیان مهم است. در آگهی بالا نیز این مورد رعایت شده بود.
» ذکر شرایط استخدام
موردی که در آگهی بالا نظرم را جلب کرد تشریح کامل شرایطی بود که متقاضیان باید آن را داشته باشند. برای مثال ذکر شرایط سنی، شرایط مربوط به عدم اشتغال به تحصیل در دانشگاهها یا موسسات یا حتی شرایط مربوط به اخراج از دانشگاه ها. در این صورت برخی از متقاضیان ولو اندک در همین ابتدا فیلتر میشوند.
»ذکر شرایط تخصصی متقاضیان کار:
در بخش به صورت کامل شرایط تخصصی و مهارتی افراد مورد بررسی قرار گرفته بود. در یک نگاه خوب به نظر میرسید ولی اگر با دقت به این بخش نگاه کنید متوجه خواهید شد به دلیل عدم نگارش صحیح موارد مورد نیاز، کمتر کسی دارای این همه توانایی است آن هم به صورت تسلط کامل. استفاده از واژه تسلط کامل باید با احتیاط انجام شود. برای مثال تسلط کامل بر VB.NET , C#.NET Windows Application . بهتر بود از یا استفاده میشد. به این صورت " تسلط بر VB.NET یا C#.NET در Windows Application"
» ذکر اولویت ها
این مورد هم به خوبی در آگهی بالا رعایت شده بود. ذکر اولویتها باعث میشود که فرد متقاضی اگر دارای حتی یکی از این موارد است آن را در رزومه خود ذکر کند و از طرفی میتوان با توجه به اولویتهای استخدام تا حدودی شرایط کاری در شرکت متقاضی را در همین ابتدا بررسی کرد.
»ذکر آدرس وب سایت شرکت:
این مورد هم به خوبی در این آگهی رعایت شد و علاوه بر آن یک لینک به آدرس وب سایت سرپرست تیم برنامه نویسان نیز وجود داشت که امکان ارتباط مستقیم را فراهم میساخت.
مواردی که در آگهی استخدام شرکت دلفین رعایت نشده بود:
»عدم توازن بین عنوان آگهی با محتوای آن :
در عنوان آگهی ذکر شده بود "برنامه نویس تحت وب" در حالی که در شرایط تخصصی، موردی به عنوان تسلط کامل بر برنامه نویس تحت ویندوز ذکر شده آن هم با دو زبان Vb.Net و C#.Net
آیا منظور از تسلط کامل بر مدیریت بانک اطلاعاتی SqlServer همان DBA است؟ اگر پاسخ مثبت است در این صورت چند نفر واجد شرایط را میتوان پیدا کرد که هم در سطح DBA باشند و هم در سطح یک برنامه نویس سطح بالا؟ اگر پاسخ منفی است بهتر بود از واژه داشتن تجربه در زمینه مدیریت بانک اطلاعاتی یا حتی آشنایی با مدیریت بانکهای اطلاعاتی استفاده میشد.
مورد دیگری که تا حدودی باعث سردرگمی میشد این است که نیاز به تسلط کامل به Asp.Net Web Form و هم چنین به Asp.Net MVC است. چرا هردو، آن هم در سطح تسلط کامل؟
در بخش اولویتها موردی ذکر شد با عنوان آشنایی با کامپوننتهای برنامه نویسی نظیر DevExpress و Telerik و Kendo. آیا منظور آشنایی با تمام این موارد بوده است یا فقط یکی از آن ها؟
یک ضعف بزرگ که در اغلب آگهیها (از جمله در این آگهی نیز) وجود دارد، عدم ذکر شرایط شرکت برای متقاضیان است. بهتر بود بعد از ذکر این همه شرایط برای متقاضیان و برنامه نوسان، کمی هم درباره وضعیت حقوق و مزایا (برای مثال ذکر حداقل حقوق) و بیمه یا حتی شرایط رفاهی و خاص در نظر گرفته شده (که البته با توجه به وضعیت فعلی که دریافت حقوق ماهانه بدون تاخیر یک موهبت است این مورد بیشتر شبیه به رویا برای برنامه نویسان خواهد بود) صحبت میشد.
در صورتی که ذکر تمام این موارد در آگهی امکان پذیر نیست میتوان با ذکر یک لینک به وب سایت شرکت مورد نظر یا حتی ذکر شماره تلفن، متقاضی کار را قبل از ارسال رزومه از شرایط شرکت برای استخدام مطلع ساخت.