VBoxManage.exe : The term 'VBoxManage.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + VBoxManage.exe modifyvm "my mac" --cpuidset 00000001 000106e5 0010080 ... + ~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (VBoxManage.exe:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
نظرات مطالب
هنگام اجری خط فرمان این error را در cmd مشاهده میکنم. ممنون میشم راهنمایی کنید که مشکل از کجاست.
اشتراکها
2.Visual Studio 2017 15.8 منتشر شد
These are the customer-reported issues addressed in 15.8.2:
- Publish single file context menu item missing.
- Git network operations not working: Cannot spawn git-askpass.exe.
- "Visual C++ Resource Editor Package" load failed.
- Preview Transform gives error.
- Cannot type close brace.
- Object reference not set to an instance of an object when deploying Service Fabric project after update 15.8.0.
- "The given path's format is not supported" installation error.
- Task ExpandPriContent failed. Illegal characters in path.
- "Could not create instance of type System.Collections.Genertic.Iset'1[Signer]" installer error.
- Service fabric deployment fails in 15.8.0.
- Cannot create app package for Windows store.
- Incorrect code generation for strongly-typed resources.
- Keyboard binding for Italian layout.
- IntelliSense broken #9999.
- When working on a Unity project and Unity rewrites multiple project files, the Visual Studio Tools for Unity will now automatically reload the solution.
- The customer will now get a dialog to close Office applications if they are blocking the Visual Studio install and causing a failure of 1303.
اشتراکها
پاسخ به برترین سوالات Python
Wondering how the pros solve that Python question? Find out with Content Developer Eric Camplin, as he hosts a team of Python Developers, including popular expert Steve Dower, who answer top Python questions for all skill levels and dive into best practices for this versatile and easy-to-use programming language.
Get practical tips, learn EAFP (“It’s Easier to Ask Forgiveness than Permission”) in working with files in Python, call external commands, look at “lazy lists,” use True/False properties of Python lists to check whether one is empty, and lots more. Plus, over time, watch this space for additional question and answer sets, as you explore the top questions programmers have about Python.
آموزش کامل AutoMapper قبلا در سایت ارائه شده است. در این مقاله میخواهیم Mapping نوعهای مختلف بین Dto و Entityهای پروژه را توسط Reflection به صورت خودکار انجام دهیم. سورس کامل مثال را میتوانید در این ریپازیتوری مشاهده کنید.
در این روش ما یک کلاس جنریک را به نام BaseDto داریم که تمام Dtoهای ما برای نگاشت خودکار باید از آن ارث بری کنند. در مثال زیر کلاس PostDto لازم است به کلاس Post نگاشت شود. پس خواهیم داشت :
public class PostDto : BaseDto<PostDto, Post, long> { public string Title { get; set; } public string Text { get; set; } public int CategoryId { get; set; } public string CategoryName { get; set; } //=> Category.Name }
- کلاس PostDto خودش را به عنوان اولین پارامتر جنریک BaseDto معرفی میکند.
- به عنوان پارامتر دوم، باید کلاس Entity ایی که قرار است به آن نگاشت شود (Post) را معرفی کنیم.
- پارامتر سوم، نوع فیلد Id است که در اینجا خاصیت Id کلاسهای Post و PostDto ما، از نوع long است.
- نهایتا خواصی را که برای نگاشت لازم داریم، تعریف میکنیم مثل Title و...
- همچنین میتوانیم خواصی برای نگاشت با خواص Navigation Propertyهای Post هم تعریف کنیم؛ مانند CategoryName که به خاصیت Name از Category پست مربوطه اشاره میکند و AutoMapper به صورت هوشمندانه آنها را به هم نگاشت میکند.
تعریف کلاس جنریک BaseDto هم به نحو زیر است.
public abstract class BaseDto<TDto, TEntity, TKey> where TDto : class, new() where TEntity : BaseEntity<TKey>, new() { [Display(Name = "ردیف")] public TKey Id { get; set; } public TEntity ToEntity() { return Mapper.Map<TEntity>(CastToDerivedClass(this)); } public TEntity ToEntity(TEntity entity) { return Mapper.Map(CastToDerivedClass(this), entity); } public static TDto FromEntity(TEntity model) { return Mapper.Map<TDto>(model); } protected TDto CastToDerivedClass(BaseDto<TDto, TEntity, TKey> baseInstance) { return Mapper.Map<TDto>(baseInstance); } }
- نوع TDto به کلاس Dto ما اشاره میکند؛ مثلا PostDto
- نوع TEntity به کلاس Entity ما اشاره میکند؛ مثلا Post
- نوع TKey به نوع خاصیت Id اشاره میکند.
- شرط لازم برای نوع TEntity این است که از <BaseEntity<TKey ارث بری کرده باشد (نوع پایهای که تمام Entityهای ما از آن ارث بری میکنند).
- متدهای کمکی ToEntity و FromEntity، کار نگاشت اشیاء را برای ما راحتتر میکنند.
پیاده سازی کلاس BaseEntity و Post نیز به شرح زیر است.
public abstract class BaseEntity<TKey> { public TKey Id { get; set; } } public class Post : BaseEntity<long> { public string Title { get; set; } public string Text { get; set; } public int CatgeoryId { get; set; } public Category Category { get; set; } }
توضیح متد های ToEntity و FromEntity
متد ToEntity شی Dto جاری را به Entity مربوطه نگاشت کرده و یک وهله از آن را باز میگرداند. پس بجای استفاده دستی از Apiهای AutoMapper مانند Mapper.Map<Post>(postDto) کافی است متد ToEntity را فراخوانی کنیم؛ مثال:
var postDto = new PostDto(); var post = postDto.ToEntity();
بنابراین برای نگاشت postDto به یک شیء Post از پیش موجود (post یافت شده توسط id) خواهیم داشت:
var post = // finded by id var updatePost = postDto.ToEntity(post);
var postDto = PostDto.FromEntity(post);
در ادامه میخواهیم کانفیگ Mapping بین Dtoهای پروژه به Entityهای مربوطه (مثلا PostDto به Dto و برعکس) را به صورت خودکار توسط Reflection پیاده سازی و اعمال کنیم. این کار توسط کلاس AutoMapperConfiguration به نحو زیر انجام میشود.
public static class AutoMapperConfiguration { public static void InitializeAutoMapper() { Mapper.Initialize(configuration => { configuration.ConfigureAutoMapperForDto(); }); //Compile mapping after configuration to boost map speed Mapper.Configuration.CompileMappings(); } public static void ConfigureAutoMapperForDto(this IMapperConfigurationExpression config) { config.ConfigureAutoMapperForDto(Assembly.GetEntryAssembly()); } public static void ConfigureAutoMapperForDto(this IMapperConfigurationExpression config, params Assembly[] assemblies) { var dtoTypes = GetDtoTypes(assemblies); var mappingTypes = dtoTypes .Select(type => { var arguments = type.BaseType.GetGenericArguments(); return new { DtoType = arguments[0], EntityType = arguments[1] }; }).ToList(); foreach (var mappingType in mappingTypes) config.CreateMappingAndIgnoreUnmappedProperties(mappingType.EntityType, mappingType.DtoType); } public static void CreateMappingAndIgnoreUnmappedProperties(this IMapperConfigurationExpression config, Type entityType, Type dtoType) { var mappingExpression = config.CreateMap(entityType, dtoType).ReverseMap(); //Ignore mapping to any property of source (like Post.Categroy) that dose not contains in destination (like PostDto) //To prevent from wrong mapping. for example in mapping of "PostDto -> Post", automapper create a new instance for Category (with null catgeoryName) because we have CategoryName property that has null value foreach (var property in entityType.GetProperties()) { if (dtoType.GetProperty(property.Name) == null) mappingExpression.ForMember(property.Name, opt => opt.Ignore()); } } public static IEnumerable<Type> GetDtoTypes(params Assembly[] assemblies) { var allTypes = assemblies.SelectMany(a => a.ExportedTypes); var dtoTypes = allTypes.Where(type => type.IsClass && !type.IsAbstract && type.BaseType != null && type.BaseType.IsGenericType && (type.BaseType.GetGenericTypeDefinition() == typeof(BaseDto<,>) || type.BaseType.GetGenericTypeDefinition() == typeof(BaseDto<,,>))); return dtoTypes; } }
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; AutoMapperConfiguration.InitializeAutoMapper(); }
- متد ConfigureAutoMapperForDto متد دیگری را به همین نام، فراخوانی میکند؛ با این تفاوت که Assembly ورودی پروژه را توسط متد ()Assembly.GetEntryAssembly، یافته و به آن پاس میدهد.
- EntryAssembly به اسمبلی ای که به عنوان نقطه ورود برنامه است، اشاره میکند. در این سورس کد چون پروژه ما از نوع ASP.NET Core است، اسمبلی این پروژه به عنوان EntryAssmebly شناخته میشود؛ یعنی همان لایهای که کلاسهای Dto ما (مانند PostDto) داخل آن تعریف شدهاست. ما به این اسمبلی از این جهت نیاز داریم که میخواهیم توسط Reflection، تمام نوعهایی که از BaseDto ارث بری میکنند (مانند PostDto) را یافته و Mapping آنها را به AutoMapper معرفی و اعمال کنیم.
نکته : اگر در پروژه شما Dtoها در لایه/لایههای دیگری تعریف شدهاند باید اسمبلی آن لایهها را به آن پاس دهید.
در این مرحله توسط متد GetDtoTypes کار یافتن نوعهای Dto موجود در اسمبلی/اسمبلیهای مشخص شده انجام میشود.
public static IEnumerable<Type> GetDtoTypes(params Assembly[] assemblies) { var allTypes = assemblies.SelectMany(a => a.ExportedTypes); var dtoTypes = allTypes.Where(type => type.IsClass && !type.IsAbstract && type.BaseType != null && type.BaseType.IsGenericType && (type.BaseType.GetGenericTypeDefinition() == typeof(BaseDto<,>) || type.BaseType.GetGenericTypeDefinition() == typeof(BaseDto<,,>))); return dtoTypes; }
- در خط اول ابتدا تمامی نوعهای قابل دسترس از بیرون (ExportedTypes) از assemblyهای دریافتی واکشی میشود.
- سپس توسط Where، نوعهایی که کلاس بوده، abstract نیستند و از BaseDto ارث بری کردهاند، فیلتر شده و بازگردانده میشوند.
در ادامه، از لیست نوعهای Dto یافت شده، پارامترهای جنریک TDto و TEntity به ازای هر نوع استخراج میشوند.
public static void ConfigureAutoMapperForDto(this IMapperConfigurationExpression config, params Assembly[] assemblies) { var dtoTypes = GetDtoTypes(assemblies); var mappingTypes = dtoTypes .Select(type => { var arguments = type.BaseType.GetGenericArguments(); return new { DtoType = arguments[0], EntityType = arguments[1] }; }).ToList(); foreach (var mappingType in mappingTypes) config.CreateMappingAndIgnoreUnmappedProperties(mappingType.EntityType, mappingType.DtoType); }
در آخر بر روی لیست یافت شده، گردش میکنیم (foreach) و دو نوع DtoType و EntityType (مانند postDto و post) را که باید به یکدیگر نگاشت شوند، به متد CreateMappingAndIgnoreUnmappedProperties ارسال میکنیم. کار این متد، معرفی/اعمال Mapping بین نوعها به کانفیگ AutoMapper میباشد. همچنین خواصی را که نباید نگاشت شوند، به طور خودکار یافته و Ignore میکند.
در مثال جاری، خاصیت CategoryName کلاس PostDto برای خواندن و select از دیتابیس لازم است زیرا میخواهیم هر postDto، شامل نام دسته بندی هر پست نیز باشد، ولی این ویژگی برای افزودن یا بهروزرسانی مدنظر ما نیست؛ چرا که کلاینت ما به هنگام فراخوانی اکشن Create، فقط مقادیر خواص Post (مانند Title, Text و CategoryId) را ارسال میکند و نه CategoryName را. در نتیجه CatgoryName همیشه null است. اما مشکلی که ایجاد میکند این است که AutoMapper به هنگام نگاشت یک PostDto به Post، چون خاصیت CategoryName با (مقدار null) وجود دارد، یک وهله جدید (با مقادیر پیشفرض) را برای Category ایجاد میکند که خاصیت Name آن برابر با null است و قطعا این مدنظر ما نیست. پس جهت جلوگیری از این مشکل لازم است خواصی از Entity که در Dto موجود نیستند (مانند Category) را Ignore کنیم و این دقیقا همان کاری است که متد CreateMappingAndIgnoreUnmappedProperties انجام میدهد.
public static void CreateMappingAndIgnoreUnmappedProperties(this IMapperConfigurationExpression config, Type entityType, Type dtoType) { var mappingExpression = config.CreateMap(entityType, dtoType).ReverseMap(); //Ignore mapping to any property of entity (like Post.Categroy) that dose not contains in dto (like PostDto.CategoryName) //To prevent from wrong mapping. for example in mapping of "PostDto -> Post", automapper create a new instance for Category (with null catgeoryName) because we have CategoryName property that has null value foreach (var property in entityType.GetProperties()) { if (dtoType.GetProperty(property.Name) == null) mappingExpression.ForMember(property.Name, opt => opt.Ignore()); } }
در آخر میتوان گفت تنها ایراد کوچک ایدهی فوق، استفاده از Apiهای استاتیک AutoMapper در کلاس BaseDto است (متد Mapper.Map) که باعث میشود نتوانیم به هنگام تست نویسی، سرویس AutoMapper را با پیاده سازی دیگری (Fake) جایگزین و آن را Mock کنیم. البته این کار برای AutoMapper زیاد معمول هم نبوده و در مقابل مزایای این ایده، به نظرم ارزش استفاده را خواهد داشت.
در قسمت بعدی همین ایده را توسعه خواهیم داد و قابلیت سفارشی سازی Mapping را برای آن فراهم خواهیم کرد.
اشتراکها
مقایسه عملکرد HTTP/3 با HTTP/2
Ubuntu is distributed on two types of images described below.
Desktop image
The desktop image allows you to try Ubuntu without changing your
computer at all, and at your option to install it permanently later.
This type of image is what most people will want to use. You will need
at least 384MiB of RAM to install from this image.
Server install image
The server install image allows you to install Ubuntu permanently on a
computer for use as a server. It will not install a graphical user
interface.
من هنگام cache کردن برخی از queryها با این خطا روبرو شدم:
System.InvalidOperationExceptionWhen called from 'VisitMemberInit', rewriting a node of type 'System.Linq.Expressions.NewExpression' must return a non-null value of the same type. Alternatively, override 'VisitMemberInit' and change it to not visit children of this type.
برای حل اون این کد رو به کلاس داخلی SubtreeEvaluator در کلاس Evaluator در فایل QueryResultCache.cs اضافه کردم:
protected override Expression VisitMemberInit(MemberInitExpression node) { if (node.NewExpression.NodeType == ExpressionType.New) return node; return base.VisitMemberInit(node); }
اشتراکها