بایدها و نبایدهای استفاده از IoC Containers
- ولی در کل اگر امکان وهله سازی کلاس BaseOperation توسط IoC Container به صورت مستقل وجود دارد (چیزی مثل استفاده از DefaultControllerFactory در ASP.NET MVC) بهتر است اجازه بدید خود IoC Container کار تزریق وابستگیها را به صورت خودکار انجام دهد و کلاسها اطلاعی از وجود آن نداشته باشند.
آموزش مقدماتی Silverlight
- لطفا برای این نوع سؤالات از قسمت تماس با من در بالای سایت استفاده کنید.
- و بله میشود. به سیلورلایت همانند یک شیء فلش نگاه کنید. اینها اشیاء سمت کاربر هستند و نه سمت سرور. بنابراین امکان اضافه کردن آنها با کمک گیری از تگ object میسر است. اطلاعات بیشتر به همراه مثال:
http://msdn.microsoft.com/en-us/library/cc189089%28VS.95%29.aspx
در ASP.NET MVC آیا ViewModel همان DTO است؟
اگر با MVVM آشنایی داشته باشید حتماً متوجه شباهت زیاد ViewModel با DTO شده اید.
البته میدانیم که ViewModel در WPF شامل رفتار اشیاء هم میتواند باشد اما DTO به هیچ عنوان دربرگیرنده رفتار اشیاء نیست.به نظرم DTO بیشتر از اینکه به ViewModel شبیه باشد به Model در MVVM شبیه است.
Model در MVVM را میتواند معادلی برای ViewModel در MVC قرار داد و ViewModel در MVVM را میتوان شبیه Controller در MVC در نظر گرفت.
به نظر من تفاوتی که DTO با ViewModel دارد این است =>
کلاس StudentService نیاز به اطلاعات موجودیت Teacher از جمله نام و شماره شناسنامه دارد . در نتیجه باید متدی در TeacherService فراهم شود که این اطلاعات را تامین کند :
public class TeacherService { internal IEnumerable<TeacherDto> GetTeachers () { return ... } }
چون متد بالا قرار نیست اطلاعاتی را به لایهی نمایش پاس دهد و اطلاعات مستقیما در یک متد سرویس استفاده میشود خروجی آن Dto تعیین شده.
به نظر من این قواعد وحی منزل نیست ، به عنوان مثال شاید شخصی در طراحی خود از DTOها به عنوان اعضای ViewModelها استفاده کند یا DTO را به Presentation layer برگرداند و آن را به ViewModel نگاشت کند.
اما در نهایت پاسخ من به این نظرسنجی گزینهی خیر است.
کتابخانه animated_alert
EF Code First #10
شما زمانی میتونید از lazy loading برای بارگذاری اشیاء مرتبط مانند حلقه زیر استفاده کنید:
foreach (var dept in db.Departments) { Console.WriteLine(dept.Name); foreach (var item in dept.Employees) { Console.WriteLine(item.FirstName); } }
در WCF یکبار اطلاعات serialize شده و اتصال بسته میشود (البته WCF فراتر است از حالت http binding ساده؛ ولی عموما این مورد در برنامههای وب مدنظر است). بنابراین اینبار اگر dept.Employees را روی لیست تهیه شده فراخوانی کنید، پیغام بسته بودن اتصال رو دریافت میکنید. به همین جهت اگر نیاز به اطلاعات کارمندان هم هست، همه را باید به یکباره از سرور دریافت کرد.
CoffeeScript #8
اصطلاحات عمومی CoffeeScript
Includes
برای چک کردن وجود یک مقدار در یک آرایه به طور معمول از indexOf استفاده میشود؛ در حالی که تمامی نسخههای IE به طور کامل از آن پشتیبانی نمیکنند.
var included = (array.indexOf("test") != -1)
included = "test" in array
included = "a long test string".indexOf("test") isnt -1
string = "a long test string" included = !~ string.indexOf "test"
تکرار Propertyها
در صورتی که به خصوصیات یک شیء چندین بار نیاز داشته باشید، در جاوااسکریپت باید از کلمهی کلیدی in استفاده کنید:
var object = {one: 1, two: 2} for(var key in object) alert(key + " = " + object[key])
object = {one: 1, two: 2} alert("#{key} = #{value}") for key, value of object
var key, object, value; object = { one: 1, two: 2 }; for (key in object) { value = object[key]; alert(key + " = " + value); }
Min/Max
درست است که این تکنیک مخصوص CoffeeScript نیست، اما اشاره به آن میتواند مفید باشد. تابع Math.max و Max.min میتوانند چندین آرگومان یا یک آرایه را به عنوان ورودی گرفته و بر روی آن محاسبات خود را انجام داده و خروجی را نشان دهند:
Math.max [14, 35, -7, 46, 98]... # 98 Math.min [14, 35, -7, 46, 98]... # -7
Math.max.apply(Math, [14, 35, -7, 46, 98]); Math.min.apply(Math, [14, 35, -7, 46, 98]);
پروژه gRPC ؛ نسل بعدی RESTful !
gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. gRPC enables client and server applications to communicate transparently, and simplifies the building of connected systems.
مقاله فارسی : پروژه gRPC ؛ نسل بعدی RESTful !
مخزن گیتهاب : https://github.com/grpc/grpc
مثال سی شارپی : https://github.com/grpc/grpc/tree/master/examples/csharp/Helloworld
مثال اول: تبدیل یک DataTable به لیست جنریک معادل
فرض کنید یک DataTable را با ساختار و دادههای ذیل در اختیار داریم:
var dataTable = new DataTable("SalaryList"); dataTable.Columns.Add("User", typeof (string)); dataTable.Columns.Add("Month", typeof (int)); dataTable.Columns.Add("Salary", typeof (decimal)); var rnd = new Random(); for (var i = 0; i < 200; i++) dataTable.Rows.Add("User " + i, rnd.Next(1, 12), rnd.Next(400, 2000));
در ادامه معادل کلاس ساختار ستونهای این DataTable را به صورت ذیل تهیه میکنیم.
public class SalaryList { public string User { set; get; } public int Month { set; get; } public decimal Salary { set; get; } }
var salaryList = AutoMapper.Mapper.DynamicMap<IDataReader, List<SalaryList>>(dataTable.CreateDataReader());
کار با AutoMapper نسبت به راه حلهای Reflection متداول بسیار سریعتر است. زیرا AutoMapper از مباحث Fast reflection به صورت توکار استفاده میکند.
مثال دوم: تبدیل لیستی از اشیاء anonymous به لیستی جنریک
در اینجا قصد داریم یک شیء anonymous را به شیء معادل SalaryList آن نگاشت کنیم. اینکار را نیز میتوان توسط متد DynamicMap انجام داد:
var anonymousObject = new { User = "User 1", Month = 1, Salary = 100000 }; var salary = Mapper.DynamicMap<SalaryList>(anonymousObject);
var anonymousList = new[] { new { User = "User 1", Month = 1, Salary = 100000 }, new { User = "User 2", Month = 1, Salary = 300000 } }; var salaryList = anonymousList.Select(item => Mapper.DynamicMap<SalaryList>(item)).ToList();
مثال سوم: نگاشت پویا به یک اینترفیس
فرض کنید یک چنین اینترفیسی، در برنامه تعریف شدهاست و همچنین دارای هیچ نوع پیاده سازی هم در برنامه نیست:
public interface ICustomerService { string Code { get; set; } string Name { get; set; } }
var anonymousObject = new { Code = "111", Name = "Test 1" }; var result = Mapper.DynamicMap<ICustomerService>(anonymousObject);
کدهای کامل این قسمت را از اینجا میتوانید دریافت کنید:
AM_Sample05.zip
var query = breeze.EntityQuery .from("Customers") .where("CompanyName", "startsWith", "A") .orderBy("CompanyName");
var promise = manager.executeQuery(query) .then(querySucceeded) .fail(queryFailed);
if (manager.hasChanges()) { manager.saveChanges().then(saveSucceeded).fail(saveFailed); } // listen for any change to a customer customer.entityAspect.propertyChanged.subscribe(somethingHappened);
<!-- Angular template --> <li data-ng-repeat="emp in employees"> <label>{{emp.FirstName}}</label> <label>{{emp.LastName}}</label> </li> // bound to employees from query manager.executeQuery(breeze.EntityQuery.from("Employees")) .then(function(data) { $scope.employees = data.results; });
/* Query with related entities using expand */ // query for orders of customers whose name begins "Alfreds" // include their customers & child details & their detail products breeze.EntityQuery.from("Orders") .where("Customer.CompanyName", "startsWith", "Alfreds") .expand("Customer, OrderDetails.Product") .using(manager) .execute().then(querySucceeded).fail(queryFailed);
// execute query asynchronously on the server manager.executeQuery(query).then(querySuccess).fail(queryFail); // execute query synchronously on local cache var customers = manager.executeQueryLocally(query)