اشتراکها
3 فریم ورک برتر IOT برای تازه کار ها
اشتراکها
10فریم ورک برتر توسعه وب در سال 2017
لطفا توجه فرمایید که جالبترین قسمت این مقاله قابلیت استفاده از کلاسهای دات نت در دل PowerShell میباشد. که در قسمت چهارم کدها مشاهده میفرمایید.
حذف تمام رکوردهای یک لیست شیرپوینت از طریق رابط کاربری SharePoint مسیر نمیباشد و لازم است برای آن چند خط کد نوشته شود که میتوانید آن را با console و جالبتر از آن با PowerShell اجرا کنید.
1- سادهترین روش حذف رکوردهای شیرپوینت را در روبرو مشاهده میفرمایید که به ازای حذف هر رکورد یک رفت و برگشت به پایگاه انجام میشودSPList list = mWeb.GetList(strUrl); if (list != null) { for (int i = list.ItemCount - 1; i >= 0; i--) { list.Items[i].Delete(); } list.Update(); }
public static void DeleteAllItems(string site, string list) { using (SPSite spSite = new SPSite(site)) { using (SPWeb spWeb = spSite.OpenWeb()) { StringBuilder deletebuilder = BatchCommand(spWeb.Lists[list]); spSite.RootWeb.ProcessBatchData(deletebuilder.ToString()); } } } private static StringBuilder BatchCommand(SPList spList) { StringBuilder deletebuilder= new StringBuilder(); deletebuilder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>"); string command = "<Method><SetList Scope=\"Request\">" + spList.ID + "</SetList><SetVar Name=\"ID\">{0}</SetVar><SetVar Name=\"Cmd\">Delete</SetVar></Method>"; foreach (SPListItem item in spList.Items) { deletebuilder.Append(string.Format(command, item.ID.ToString())); } deletebuilder.Append("</Batch>"); return deletebuilder; }
3- در قسمت زیر همان روش batch قبلی را مشاهده میفرمایید که با تقسیم کردن batch ها به تکههای 1000 تایی کارایی آن را بالا برده ایم
// We prepare a String.Format with a String.Format, this is why we have a {{0}} string command = String.Format("<Method><SetList Scope=\"Request\">{0}</SetList><SetVar Name=\"ID\">{{0}}</SetVar><SetVar Name=\"Cmd\">Delete</SetVar><SetVar Name=\"owsfileref\">{{1}}</SetVar></Method>", list.ID); // We get everything but we limit the result to 100 rows SPQuery q = new SPQuery(); q.RowLimit = 100; // While there's something left while (list.ItemCount > 0) { // We get the results SPListItemCollection coll = list.GetItems(q); StringBuilder sbDelete = new StringBuilder(); sbDelete.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>"); Guid[] ids = new Guid[coll.Count]; for (int i=0;i<coll.Count;i++) { SPListItem item = coll[i]; sbDelete.Append(string.Format(command, item.ID.ToString(), item.File.ServerRelativeUrl)); ids[i] = item.UniqueId; } sbDelete.Append("</Batch>"); // We execute it web.ProcessBatchData(sbDelete.ToString()); //We remove items from recyclebin web.RecycleBin.Delete(ids); list.Update(); } }
برای فهم script پاور شل زیر کافیست به چند نکته ساده زیر دقت کنید
- ایجاد متغیرها به سادگی با شروع نوشتن نام متغیر با $ و بدون تعریف نوع آنها انجام میشود
- write-host حکم write را دارد و واضح است که نوشتن تنهای آن برای ایجاد یک line break میباشد.
- کامنت کردن با #
- عدم وجود semi colon برای اتمام فرامین
[System.Reflection.Assembly]::Load("Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") [System.Reflection.Assembly]::Load("Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") [System.Reflection.Assembly]::Load("Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c") [System.Reflection.Assembly]::Load("System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") write-host # Enter your configuration here $siteUrl = "http://mysharepointsite.example.com/" $listName = "Name of my list" $batchSize = 1000 write-host "Opening web at $siteUrl..." $site = new-object Microsoft.SharePoint.SPSite($siteUrl) $web = $site.OpenWeb() write-host "Web is: $($web.Title)" $list = $web.Lists[$listName]; write-host "List is: $($list.Title)" while ($list.ItemCount -gt 0) { write-host "Item count: $($list.ItemCount)" $batch = "<?xml version=`"1.0`" encoding=`"UTF-8`"?><Batch>" $i = 0 foreach ($item in $list.Items) { $i++ write-host "`rProcessing ID: $($item.ID) ($i of $batchSize)" -nonewline $batch += "<Method><SetList Scope=`"Request`">$($list.ID)</SetList><SetVar Name=`"ID`">$($item.ID)</SetVar><SetVar Name=`"Cmd`">Delete</SetVar><SetVar Name=`"owsfileref`">$($item.File.ServerRelativeUrl)</SetVar></Method>" if ($i -ge $batchSize) { break } } $batch += "</Batch>" write-host write-host "Sending batch..." # We execute it $result = $web.ProcessBatchData($batch) write-host "Emptying Recycle Bin..." # We remove items from recyclebin $web.RecycleBin.DeleteAll() write-host $list.Update() } write-host "Done."
نکته تکمیلی
و برای دسترسی به Nested Container جاری میتوان به شکل زیر عمل کرد:
در پروژه خود از الگوی Container Per Request استفاده میکنید؟ برای نزدیکتر کردن شرایط تست به شرایط محیط عملیاتی میتوان به شکل زیر عمل کرد:
کلاسی برای ایجاد و تخریب Nested Container
public static class TestDependencyScope { private static IContainer _currentNestedContainer; public static void Begin() { if (_currentNestedContainer != null) throw new Exception("Cannot begin test dependency scope. Another dependency scope is still in effect."); _currentNestedContainer = IoC.Container.GetNestedContainer(); } public static IContainer CurrentNestedContainer { get { if (_currentNestedContainer == null) throw new Exception($"Cannot access the {nameof(CurrentNestedContainer)}. There is no dependency scope in effect."); return _currentNestedContainer; } } public static void End() { if (_currentNestedContainer == null) throw new Exception("Cannot end test dependency scope. There is no dependency scope in effect."); _currentNestedContainer.Dispose(); _currentNestedContainer = null; } }
سپس به مانند AutoRollbackAttrbiute مذکور در مطلب جاری، ContainerPerTestCaseAttribute را برای مدیریت این قضیه در نظر میگیریم:
public class ContainerPerTestCaseAttribute : Attribute, ITestAction { public void BeforeTest(ITest test) { TestDependencyScope.Begin(); } public void AfterTest(ITest test) { TestDependencyScope.End(); } public ActionTargets Targets => ActionTargets.Test; }
و حال نحوه استفاده از آن:
[PopulateHttpContext] [ContainerPerTestCase] [Transactional] [TestFixture] public class IntegratedTestBase { [SetUp] public void EachTestSetUp() { BeforeEachTest(); } [TearDown] public void EachTestTearDown() { AfterEachTest(); } protected virtual void BeforeEachTest() { } protected virtual void AfterEachTest() { } protected void UsingUnitOfWork(Action<IUnitOfWork> action) { IoC.Container.Using((IUnitOfWork uow)=> { uow.DisableAllFilters(); action(uow); }); } protected T UsingUnitOfWork<T>(Func<IUnitOfWork, T> func) { var uow = IoC.Resolve<IUnitOfWork>(); uow.DisableAllFilters(); using (uow) { var result = func(uow); uow.SaveChanges(); return result; } } protected async Task<T> UsingUnitOfWorkAsync<T>(Func<IUnitOfWork, Task<T>> func) { var uow = IoC.Resolve<IUnitOfWork>(); uow.DisableAllFilters(); using (uow) { var result = await func(uow).ConfigureAwait(false); await uow.SaveChangesAsync().ConfigureAwait(false); return result; } } }
namespace ProjectName.ServiceLayer.IntegrationTests { public static class Testing { private static IContainer Container => TestDependencyScope.CurrentNestedContainer; public static T Resolve<T>() { return Container.GetInstance<T>(); } public static object Resolve(Type type) { return Container.GetInstance(type); } public static void Inject<T>(T instance) where T : class { Container.Inject(instance); } } } //in test classes using static ProjectName.ServiceLayer.IntegrationTests.Testing; namespace ProjectName.ServiceLayer.IntegrationTests { public class RoleServiceTests : IntegratedTestBase { private IRoleService _service; protected override void BeforeEachTest() { _service = Resolve<IRoleService>(); } } }
IdentityServer از زمان ارائهی نگارش 5 آن دیگر رایگان نیست و پیشتر مایکروسافت از نگارش 4 آن در قالبهای استاندارد پروژههای Blazor استفاده کرده بود. نگارش قبلی آن تنها در پروژههای NET 5x. پشتیبانی خواهد شد. نگارش 5 آن در پروژههای NET 6x. به همراه ذکر دقیق مجوز آن هنوز هم حضور خواهد داشت. از نگارش 7 دات نت، فکر دیگری خواهند کرد.
نظرات مطالب
Blazor 5x - قسمت 25 - تهیه API مخصوص Blazor WASM - بخش 2 - تامین پایهی اعتبارسنجی و احراز هویت
IdentityServer از زمان ارائهی نگارش 5 آن دیگر رایگان نیست و پیشتر
مایکروسافت از نگارش 4 آن در قالبهای استاندارد پروژههای Blazor استفاده
کرده بود. نگارش قبلی آن تنها در پروژههای NET 5x. پشتیبانی خواهد شد.
نگارش 5 آن در پروژههای NET 6x. به همراه ذکر دقیق مجوز آن هنوز هم حضور
خواهد داشت. از نگارش 7 دات نت، فکر دیگری خواهند کرد.
نظرات مطالب
Entity Framework و آینده
دو گل سرسبد ایران یکی آموزش و پرورش یکی تامین اجتماعی که علاقشون به foxpro و فلاپی تموم نمیشه ،ولی در نظر بگیرید به مشتری تون بگید ( سازمانی یا عمومی) نرم افزار روی ویندوز xp نصب نمیشه! خودمم باشم قبول نمیکنم. با اینکه تمام سیستمها رو معمولا به سون ارتقا میدیم ولی بعضی وقتها سیستم قدیمیه و نمیکشه روش سون نصب کرد.نکته ای دیگه ای که وجود داره همه دنیا مثل ما پیشرفته و پول دار نیستند که روی همه کامپیوتر هاشون ویندوز سون ultimate نصب کنند.