پایین صفحه لینکی که معرفی کردم، یک سری ویدیو هم برای آموزش آن معرفی کرده.
خلاصه اشتراکهای روز پنج شنبه 12 آبان 1390
پایین صفحه لینکی که معرفی کردم، یک سری ویدیو هم برای آموزش آن معرفی کرده.
در این مقاله قصد داریم یک Api تحت وب را با استفاده از فریمورک ASP.NET Core توسعه دهیم تا عملیات CRUD را بر روی دیتابیس MongoDb که یکی از محبوبترین دیتابیسهای NoSql است، انجام دهد. قبل از شروع کار باید ویژوال استودیو نسخهی 2019 را نصب داشته باشید؛ بهطوریکه ورک لود ASP.NET and web development را هم حتما همراه آن نصب کرده باشید. علاوه بر آن باید .Net Core SDK 3.0+ و دیتابیس MongoDb را هم نصب کنید که میتوانید آنها را از آدرسهای زیر دانلود کنید. نگران نصب MongoDb هم نباشید چون نکته خاصی ندارد.
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/
https://dotnet.microsoft.com/download/dotnet-core
نسخهی جاری MongoDb، 4.4 است که پس از نصب، به صورت پیشفرض در آدرس C:\Program Files\MongoDB قرار میگیرد. در مسیر C:\Program Files\MongoDB\Server\4.4\bin فایلهای اصلی MongoDb قرار دارند و برای تعامل با MongoDb، به این فایلها نیاز خواهیم داشت. پس برای اینکه به راحتی بتوان در هر جای سیستم از طریق پاورشل به این فایلها دسترسی داشته باشید، این مسیر را به Path environment variable ویندوز اضافه کنید.
MongoDb دارای یک بخش اصلی یا اصطلاحا یکdaemon است که وظیفهی آن، پردازش درخواستهایی است که برای کار با دادهها صادر میشود. در حقیقت همه کارهایی که ما با دادهها انجام میدهیم مثلا دسترسی به دادهها و دستکاری آنها، از طریق این daemon انجام میگیرد و پشت صحنهی این daemon، با Storage Engine کار خواهد کرد. برای اجرای daemon، پاور شل را باز کنید و دستور mongod را وارد کنید. اگر با تنظیمات پیشفرض اجرا کنید، بر روی پورت 27017 بالا آمده و فایلهای دیتابیس را هم در مسیر C:\data\db قرار میدهد. اگر این مسیر را نداشته باشید، با خطا مواجه میشوید. یا باید این مسیر را تعریف کنید و یا از سوئیچ dbpath -- استفاده کنید تا مسیر فایل دیتابیس را تغییر دهید. پس پاور شل را باز کنید و دستور زیر را وارد کنید.
>> mongod --dbpath C:\BooksData
>> mongo
>> use BookstoreDb
بعد از ساختن دیتابیس، باید یک کالکشن بسازید. کالکشنها را میتوان معادل جداول، در دیتابیسهای رابطهای تصور کرد. با دستور createCollection می توان اینکار را انجام داد. برای اینکار دستور زیر را وارد کنید.
>> db.createCollection('Books')
بعد از ساختن کالکشن، میخواهیم مقداری دیتا را در آن قرار دهیم. معادل رکورد در دیتابیسهای رابطهای، در دیتابیس مونگو دیبی، Document نام دارد که مانند رکوردهای دیتابیسهای رابطهای نیست و ساختار و اسکیمای خاصی ندارد؛ یعنی میتوان هر دیتایی را با هر ساختاری در آن ذخیره کرد. میخواهیم دو Document را به کالکشن Books اضافه کنیم. پس دستور زیر را وارد میکنیم. توجه کنید دادهها با ساختار json وارد میشوند.
>> db.Books.insertMany([{'Name':'Design Patterns','Price':54.93,'Category':'Computers','Author':'Ralph Johnson'}, {'Name':'Clean Code','Price':43.15,'Category':'Computers','Author':'Robert C. Martin'}])
{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }
>> db.Books.find().pretty()
{ "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" }, { "_id" : ObjectId("5bfd996f7b8e48dc15ff215e"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" }
public class MongoDbContext : IMongoDbContext { public const string DatabaseName = "MongoDbTest"; private static readonly IMongoClient _client; private static readonly IMongoDatabase Database; static MongoDbContext() { _client = new MongoClient(); Database = _client.GetDatabase(DatabaseName); } public IMongoCollection<TEntity> GetCollection<TEntity>() { return Database.GetCollection<TEntity>(typeof(TEntity).Name.ToLower() + "s"); } }
public interface IMongoDbContext { IMongoCollection<TEntity> GetCollection<TEntity>(); }
public interface IMongoDbRepository { Task<List<TEntity>> GetMany<TEntity>(FilterDefinition<TEntity> filter) where TEntity : class, new(); }
public class MongoRepository : IMongoDbRepository { private IMongoDbContext _mongoDbContext ; public MongoRepository(IMongoDbContext mongoDbContext) { _mongoDbContext = mongoDbContext; } public async Task<List<TEntity>> GetMany<TEntity>(FilterDefinition<TEntity> filter) where TEntity : class, new() { var collection = GetCollection<TEntity>(); var entities = await collection.Find(filter).ToListAsync(); return entities; } private IMongoCollection<TEntity> GetCollection<TEntity>() { return _mongoDbContext.GetCollection<TEntity>(); } }
public class HomeController : Controller { private IMongoDbRepository _mongoDbRepository; public HomeController(IMongoDbRepository mongoDbRepository) { this._mongoDbRepository = mongoDbRepository; } // GET: Home public async Task<ActionResult> Index() { var filter = Builders<Resturant>.Filter.Gte("Capacity", 400); var c =await _mongoDbRepository.GetMany<Resturant>(filter); return View(c); } }
var srcImage = new Mat(@"..\..\Images\Test.jpg"); Cv2.ImShow("Source", srcImage); Cv2.WaitKey(1); // do events var grayImage = new Mat(); Cv2.CvtColor(srcImage, grayImage, ColorConversion.BgrToGray); Cv2.EqualizeHist(grayImage, grayImage);
var cascade = new CascadeClassifier(@"..\..\Data\haarcascade_frontalface_alt.xml"); var nestedCascade = new CascadeClassifier(@"..\..\Data\haarcascade_eye_tree_eyeglasses.xml"); var faces = cascade.DetectMultiScale( image: grayImage, scaleFactor: 1.1, minNeighbors: 2, flags: HaarDetectionType.Zero | HaarDetectionType.ScaleImage, minSize: new Size(30, 30) ); Console.WriteLine("Detected faces: {0}", faces.Length);
var rnd = new Random(); var count = 1; foreach (var faceRect in faces) { var detectedFaceImage = new Mat(srcImage, faceRect); Cv2.ImShow(string.Format("Face {0}", count), detectedFaceImage); Cv2.WaitKey(1); // do events var color = Scalar.FromRgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); Cv2.Rectangle(srcImage, faceRect, color, 3); count++; } Cv2.ImShow("Haar Detection", srcImage); Cv2.WaitKey(1); // do events
var rnd = new Random(); var count = 1; foreach (var faceRect in faces) { var detectedFaceImage = new Mat(srcImage, faceRect); Cv2.ImShow(string.Format("Face {0}", count), detectedFaceImage); Cv2.WaitKey(1); // do events var color = Scalar.FromRgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); Cv2.Rectangle(srcImage, faceRect, color, 3); var detectedFaceGrayImage = new Mat(); Cv2.CvtColor(detectedFaceImage, detectedFaceGrayImage, ColorConversion.BgrToGray); var nestedObjects = nestedCascade.DetectMultiScale( image: detectedFaceGrayImage, scaleFactor: 1.1, minNeighbors: 2, flags: HaarDetectionType.Zero | HaarDetectionType.ScaleImage, minSize: new Size(30, 30) ); Console.WriteLine("Nested Objects[{0}]: {1}", count, nestedObjects.Length); foreach (var nestedObject in nestedObjects) { var center = new Point { X = Cv.Round(nestedObject.X + nestedObject.Width * 0.5) + faceRect.Left, Y = Cv.Round(nestedObject.Y + nestedObject.Height * 0.5) + faceRect.Top }; var radius = Cv.Round((nestedObject.Width + nestedObject.Height) * 0.25); Cv2.Circle(srcImage, center, radius, color, thickness: 3); } count++; } Cv2.ImShow("Haar Detection", srcImage); Cv2.WaitKey(1); // do events
<ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" PrivateAssets="All" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup>
Unable to create an object of type 'ApplicationDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { public ApplicationDbContext CreateDbContext(string[] args) { return new ApplicationDbContext(siteSettings, httpContextAccessor, hostingEnvironment, logger); } }
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var builder = new DbContextOptionsBuilder<MyDbContext>(); var connectionString = configuration.GetConnectionString("DefaultConnection"); builder.UseSqlServer(connectionString); return new MyDbContext(builder.Options); } }