«چگونه باید اسمبلیهای ماژول نظرسنجی را به ModuleCore بشناسونیم؟»
پاسخ: «اصول طراحی یک سیستم افزونه پذیر به کمک StructureMap» و یا «مطالب گروه mef»
پاسخ: «اصول طراحی یک سیستم افزونه پذیر به کمک StructureMap» و یا «مطالب گروه mef»
[ImplementPropertyChanged] // AOP public class LoginPageModel : DataErrorInfoBase
public class User : BaseEntity
[ImplementPropertyChanged] // AOP public abstract class BaseEntity : DataErrorInfoBase //پیاده سازی خودکار سیستم اعتبارسنجی یکپارچه
/// <summary> /// تغییر مقدار یک خاصیت را اطلاع رسانی خواهد کرد /// </summary> /// <param name="propertyName">نام خاصیت</param> public void NotifyPropertyChanged(string propertyName) /// <summary> /// تغییر مقدار یک خاصیت را اطلاع رسانی خواهد کرد /// </summary> /// <param name="expression">نام خاصیت مورد نظر</param> public void NotifyPropertyChanged(Expression<Func<object>> expression)
public class AlertConfirmBoxViewModel : BaseViewModel { AlertConfirmBoxModel _alertConfirmBoxModel; public AlertConfirmBoxModel AlertConfirmBoxModel { set { _alertConfirmBoxModel = value; NotifyPropertyChanged("AlertConfirmBoxModel"); // ویا .... NotifyPropertyChanged(()=>AlertConfirmBoxModel); } get { return _alertConfirmBoxModel; } }
<TextBox Text="{Binding Path=ChangeProfileData.UserName, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=true, ValidatesOnExceptions=true, ValidatesOnDataErrors=True, TargetNullValue=''}" />
به علاوه باید دقت داشت که این مورد ویژه را باید بر اساس آخرین Build کتابخانه MahApps.Metro که بهروزتر است دریافت و استفاده کرد. در اینجا با پارامتر Pre ذکر شده است.
PM> Install-Package MahApps.Metro -Pre
using System.Web.Mvc;
namespace MvcApplication16.Controllers
{
public class HomeController : Controller
{
[OutputCache(Duration = 60, VaryByParam = "none")]
public ActionResult Index()
{
return View();
}
}
}
using System;
using System.Web.Mvc;
namespace MvcApplication16.Controllers
{
public class HomeController : Controller
{
[OutputCache(Duration = 60, VaryByParam = "none")]
public ActionResult Index()
{
ViewBag.ControllerTime = DateTime.Now;
return View();
}
}
}
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>@ViewBag.ControllerTime</p>
<p>@DateTime.Now</p>
using System;
using System.Web.Mvc;
namespace MvcApplication16.Controllers
{
public class HomeController : Controller
{
[OutputCache(Duration = 60, VaryByParam = "none")]
public ActionResult Index(string parameter)
{
ViewBag.Msg = parameter ?? string.Empty;
ViewBag.ControllerTime = DateTime.Now;
return View();
}
}
}
@{
ViewBag.Title = "Index";
}
<h2>@ViewBag.Msg</h2>
<p>@ViewBag.ControllerTime</p>
<p>@DateTime.Now</p>
@using (Html.BeginForm())
{
@Html.TextBox("parameter")
<input type="submit" />
}
[OutputCache(Duration = 60, VaryByParam = "parameter")]
public ActionResult Index(string parameter)
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
using System;
using System.Web.Mvc;
namespace MvcApplication16.Helper
{
/// <summary>
/// Adds "Cache-Control: private, max-age=0" header,
/// ensuring that the responses are not cached by the user's browser.
/// </summary>
public class NoCachingAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.HttpContext.Response.CacheControl = "private";
filterContext.HttpContext.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(0));
}
}
}
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Aggressive" location="ServerAndClient" duration="300"/>
<add name="Mild" duration="100" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
[OutputCache(CacheProfile = "Aggressive", VaryByParam = "parameter")]
public ActionResult Index(string parameter)
@{ Response.WriteSubstitution(ctx => DateTime.Now.ToShortTimeString()); }
using System;
using System.Web;
using System.Web.Caching;
namespace MvcApplication16.Helper
{
public static class CacheManager
{
public static void CacheInsert(this HttpContextBase httpContext, string key, object data, int durationMinutes)
{
if (data == null) return;
httpContext.Cache.Add(
key,
data,
null,
DateTime.Now.AddMinutes(durationMinutes),
TimeSpan.Zero,
CacheItemPriority.AboveNormal,
null);
}
public static T CacheRead<T>(this HttpContextBase httpContext, string key)
{
var data = httpContext.Cache[key];
if (data != null)
return (T)data;
return default(T);
}
public static void InvalidateCache(this HttpContextBase httpContext, string key)
{
httpContext.Cache.Remove(key);
}
}
}
[Authorize]
[OutputCache(Duration = 60)]
public ActionResult Index()
interface IFoo { void Bar(); } abstract class Foo : IFoo { public abstract void Bar(); }
using FluentNHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHSample1.Mappings;
namespace ConsoleTestApplication
{
class CDb
{
public static void CreateDb(IPersistenceConfigurer dbType)
{
var cfg = Fluently.Configure().Database(dbType);
PersistenceModel pm = new PersistenceModel();
pm.AddMappingsFromAssembly(typeof(CustomerMapping).Assembly);
var sessionSource = new SessionSource(
cfg.BuildConfiguration().Properties,
pm);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session, true);
}
}
}
CDb.CreateDb(
MsSqlConfiguration
.MsSql2008
.ConnectionString("Data Source=(local);Initial Catalog=HelloNHibernate;Integrated Security = true")
.ShowSql());
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHSample1.Mappings;
namespace ConsoleTestApplication
{
class Config
{
public static ISessionFactory CreateSessionFactory(IPersistenceConfigurer dbType)
{
return
Fluently.Configure().Database(dbType
).Mappings(m => m.FluentMappings.AddFromAssembly(typeof(CustomerMapping).Assembly))
.BuildSessionFactory();
}
}
}
using System;
using NHibernate;
using NHSample1.Domain;
namespace ConsoleTestApplication
{
class CDbOperations
{
ISessionFactory _factory;
public CDbOperations(ISessionFactory factory)
{
_factory = factory;
}
public int AddNewCustomer()
{
using (ISession session = _factory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
Customer vahid = new Customer()
{
FirstName = "Vahid",
LastName = "Nasiri",
AddressLine1 = "Addr1",
AddressLine2 = "Addr2",
PostalCode = "1234",
City = "Tehran",
CountryCode = "IR"
};
Console.WriteLine("Saving a customer...");
session.Save(vahid);
session.Flush();//چندین عملیات با هم و بعد
transaction.Commit();
return vahid.Id;
}
}
}
public void DeleteCustomer(int id)
{
using (ISession session = _factory.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
Customer customer = session.Load<Customer>(id);
Console.WriteLine("Id:{0}, Name: {1}", customer.Id, customer.FirstName);
Console.WriteLine("Deleting a customer...");
session.Delete(customer);
session.Flush();//چندین عملیات با هم و بعد
transaction.Commit();
}
}
}
}
}
using System;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHSample1.Domain;
namespace ConsoleTestApplication
{
class Program
{
static void Main(string[] args)
{
//CDb.CreateDb(SQLiteConfiguration.Standard.ConnectionString("data source=sample.sqlite").ShowSql());
//return;
//todo: Read ConnectionString from app.config or web.config
using (ISessionFactory session = Config.CreateSessionFactory(
MsSqlConfiguration
.MsSql2008
.ConnectionString("Data Source=(local);Initial Catalog=HelloNHibernate;Integrated Security = true")
.ShowSql()
))
{
CDbOperations db = new CDbOperations(session);
int id = db.AddNewCustomer();
Console.WriteLine("Loading a customer and delete it...");
db.DeleteCustomer(id);
}
Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}
Saving a customer...
NHibernate: select next_hi from hibernate_unique_key with (updlock, rowlock)
NHibernate: update hibernate_unique_key set next_hi = @p0 where next_hi = @p1;@p0 = 17, @p1 = 16
NHibernate: INSERT INTO [Customer] (FirstName, LastName, AddressLine1, AddressLine2, PostalCode, City, CountryCode, Id) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7);@p0 = 'Vahid', @p1 = 'Nasiri', @p2 = 'Addr1', @p3 = 'Addr2', @p4 = '1234', @p5 = 'Tehran', @p6 = 'IR', @p7 = 16016
Loading a customer and delete it...
NHibernate: SELECT customer0_.Id as Id2_0_, customer0_.FirstName as FirstName2_0_, customer0_.LastName as LastName2_0_, customer0_.AddressLine1 as AddressL4_2_0_, customer0_.AddressLine2 as AddressL5_2_0_, customer0_.PostalCode as PostalCode2_0_, customer0_.City as City2_0_, customer0_.CountryCode as CountryC8_2_0_ FROM [Customer] customer0_ WHERE customer0_.Id=@p0;@p0 = 16016
Id:16016, Name: Vahid
Deleting a customer...
NHibernate: DELETE FROM [Customer] WHERE Id = @p0;@p0 = 16016
Press a key...
CDb.CreateDb(SQLiteConfiguration.Standard.ConnectionString("data source=sample.sqlite").ShowSql());
//todo: Read ConnectionString from app.config or web.config
using (ISessionFactory session = Config.CreateSessionFactory(
SQLiteConfiguration.Standard.ConnectionString("data source=sample.sqlite").ShowSql()
))
{
...
public class ModelStateFeatureFilter : IAsyncActionFilter { public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var state = context.ModelState; // store state ... await next(); } }
namespace ServiceLayer.EFServices { public class TABMPCREWService : ITABMPCREWService { private IUnitOfWork _uow; private IDbSet<TABMPCREWS> _tabmpcrews; public TABMPCREWService(IUnitOfWork uow) { this._uow = uow; _tabmpcrews = uow.Set<TABMPCREWS>(); } public int Add(TABMPCREWS personnel) { int rowEffect = 0; _tabmpcrews.Add(personnel); rowEffect = _uow.SaveChanges(); return rowEffect; } } }
namespace ServiceLayer.Interface { public interface ITABMPCREWService { int Add(TABMPCREWS personnel); } }
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); ObjectFactory.Initialize(x => { x.For<ITABMPCREWService>().Use<TABMPCREWService>(); // x.For<IUsersService>().Use<UsersService>(); }); ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); // initStructureMap(); }
public class StructureMapControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if (controllerType == null) throw new InvalidOperationException(string.Format("Page not found: {0}", requestContext.HttpContext.Request.Url.AbsoluteUri.ToString(CultureInfo.InvariantCulture))); return ObjectFactory.GetInstance(controllerType) as Controller; } }
public class HomeController : Controller { public readonly ITABMPCREWService aa ; public HomeController(ITABMPCREWService tabmpcrewService) { aa = tabmpcrewService; } public ActionResult Index() { TABMPCREWS tt = new TABMPCREWS() { DTLASTUPDATEDDATE = DateTime.Now, INTOTRATE = 122, INTRATE = 215, VCCODEDESCRIPTION = "fff858699", VCCODEVALUE = "fff858699", VCLASTUSERID = "fff858699", INTCREWCODE = 105652 }; aa.Add(tt); ViewBag.Message = "Welcome to ASP.NET MVC!"; return View(); } public ActionResult About() { ViewBag.Message = "Your app description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }
public class User { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } public class Login { public int ID { get; set; } public DateTime Date { get; set; } public int UserID { get; set; } public User User { get; set; } }
int usersCount = 1200; Random rnd = new Random(); for(int i=0; i<usersCount; i++) { Users.Add(new User() { Name = $"User {i + 1}", Age = rnd.Next(10, i + 10) / 10 }); } SaveChanges(); $"Users: {Users.Count()}".Dump(); var usersID = Users.Select(x => x.ID).ToArray(); int loginsCount = 20000; for(int i=0; i<loginsCount; i++) { Logins.Add(new Login() { UserID = usersID[rnd.Next(0, usersID.Length - 1)], Date = DateTime.Now.AddDays(rnd.Next(0, i)) }); if(i % 1000 == 0) { SaveChanges(); $"Save {i + 1}".Dump(); } } SaveChanges(); $"Logins: {Logins.Count()}".Dump();
$"Users: {Users.Count()}".Dump(); $"Logins: {Logins.Count()}".Dump(); Users: 1200 Logins: 21000
var data = ( from u in Users join x in Logins on u.ID equals x.UserID into g from x in g.DefaultIfEmpty() select new { UserID = u.ID, Name = u.Name, Age = u.Age, Date = x.Date } ); var result = ( from d in data group d by d.UserID into g select new { UserID = g.Key, Name = g.FirstOrDefault().Name, LoginsCount = g.Count(x => x.Date != null), LastLogin = g.Max(x => (DateTime?) x.Date) ?? null } );
SELECT [Project7].[ID] AS [ID], [Project7].[C2] AS [C1], [Project7].[C3] AS [C2], [Project7].[C1] AS [C3] FROM ( SELECT [Project6].[ID] AS [ID], CASE WHEN ([Project6].[C3] IS NULL) THEN CAST(NULL AS datetime2) ELSE [Project6].[C4] END AS [C1], [Project6].[C1] AS [C2], [Project6].[C2] AS [C3] FROM ( SELECT [Project5].[ID] AS [ID], [Project5].[C1] AS [C1], [Project5].[C2] AS [C2], [Project5].[C3] AS [C3], (SELECT MAX( CAST( [Extent9].[Date] AS datetime2)) AS [A1] FROM [dbo].[Users] AS [Extent8] LEFT OUTER JOIN [dbo].[Logins] AS [Extent9] ON [Extent8].[ID] = [Extent9].[UserID] WHERE [Project5].[ID] = [Extent8].[ID]) AS [C4] FROM ( SELECT [Project4].[ID] AS [ID], [Project4].[C1] AS [C1], [Project4].[C2] AS [C2], (SELECT MAX( CAST( [Extent7].[Date] AS datetime2)) AS [A1] FROM [dbo].[Users] AS [Extent6] LEFT OUTER JOIN [dbo].[Logins] AS [Extent7] ON [Extent6].[ID] = [Extent7].[UserID] WHERE [Project4].[ID] = [Extent6].[ID]) AS [C3] FROM ( SELECT [Project3].[ID] AS [ID], [Project3].[C1] AS [C1], (SELECT COUNT(1) AS [A1] FROM [dbo].[Logins] AS [Extent5] WHERE [Project3].[ID] = [Extent5].[UserID]) AS [C2] FROM ( SELECT [Distinct1].[ID] AS [ID], (SELECT TOP (1) [Extent3].[Name] AS [Name] FROM [dbo].[Users] AS [Extent3] LEFT OUTER JOIN [dbo].[Logins] AS [Extent4] ON [Extent3].[ID] = [Extent4].[UserID] WHERE [Distinct1].[ID] = [Extent3].[ID]) AS [C1] FROM ( SELECT DISTINCT [Extent1].[ID] AS [ID] FROM [dbo].[Users] AS [Extent1] LEFT OUTER JOIN [dbo].[Logins] AS [Extent2] ON [Extent1].[ID] = [Extent2].[UserID] ) AS [Distinct1] ) AS [Project3] ) AS [Project4] ) AS [Project5] ) AS [Project6] ) AS [Project7] ORDER BY [Project7].[C3] ASC, [Project7].[ID] ASC
var data = ( from x in Logins group x by x.UserID into g orderby g.Key descending select new { UserID = g.Key, LoginsCount = g.Count(), LastLogin = g.Max(d => d.Date) } ); var result = ( from u in Users join d in data on u.ID equals d.UserID into g from d in g.DefaultIfEmpty() select new { UserID = u.ID, LoginsCount = d != null ? d.LoginsCount : 0, LastLogin = d != null ? (DateTime?)d.LastLogin : null } );
SELECT [Project1].[ID] AS [ID], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2] FROM ( SELECT [Extent1].[ID] AS [ID], CASE WHEN ([GroupBy1].[K1] IS NOT NULL) THEN [GroupBy1].[A1] ELSE 0 END AS [C1], CASE WHEN ([GroupBy1].[K1] IS NOT NULL) THEN CAST( [GroupBy1].[A2] AS datetime2) END AS [C2] FROM [dbo].[Users] AS [Extent1] LEFT OUTER JOIN (SELECT [Extent2].[UserID] AS [K1], COUNT(1) AS [A1], MAX([Extent2].[Date]) AS [A2] FROM [dbo].[Logins] AS [Extent2] GROUP BY [Extent2].[UserID] ) AS [GroupBy1] ON [Extent1].[ID] = [GroupBy1].[K1] ) AS [Project1] ORDER BY [Project1].[C1] ASC, [Project1].[ID] ASC