我正在构建我自己的自定义存储库,基于实体框架,我正在创建一些扩展方法,允许我将部分视图模型保存为实体模型,因此我正在构建自己的添加和更新方法.
目前,每个方法都有来自DbContext的SaveChanges(),在末尾调用,这意味着每个模型都会调用一个调用.
我正在为MVC4站点构建这个基本DAL模式,这意味着大多数时候我将访问1个模型,但事实并非必须如此.
在更新即3个实体时为每个模型调用SaveChanges()是不是太糟糕的做法,还是应该先将所有内容添加到对象上下文中,而不是将SaveChanges()作为某种事务提交?
我试图用ASP.NET/Entity Framework Core实现基本的UoW/Repository模式,我遇到了非常令人不安的行为.
我的解决方案共包含4个项目.
.DAL项目,我的实体类被定义,我的DbContext定义在哪里:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ApplicationDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
.Facade项目,我的IUnitOfWork和IProductRepository定义在:
public interface IUnitOfWork
{
IProductRepository Products { get; }
}
public interface IProductRepository
{
string GetName(int id);
}
Run Code Online (Sandbox Code Playgroud)
.Fadeade.EF项目,我的Facade用EF实现:
public class UnitOfWork : IUnitOfWork
{
private ApplicationDbContext _context;
public IProductRepository Products { get; private set; }
internal ApplicationDbContext …Run Code Online (Sandbox Code Playgroud) 我对GCM Sender ID和API密钥感到困惑.我负责构建第三方服务器,该服务器将向Android应用程序发送通知.
我必须在服务器端存储哪一个?API密钥或发件人ID?谁负责创建Android开发人员或我?
我正在阅读有关制作自定义主体的教程,我遇到了代码:
public class BaseController : Controller
{
protected virtual new UserPrincipal User
{
get { return HttpContext.User as UserPrincipal; }
}
}
Run Code Online (Sandbox Code Playgroud)
"受保护的虚拟新"究竟是如何运作的?
关键词"新"是最让我困惑的.
我有@ Html.ValidationMessageFor帮助器和jquery不显眼的验证设置的剃刀视图.
我想调用控制器/操作,并通过使用已经设置的相同验证逻辑来显示操作返回的最终模型状态错误.
我已经做了一些代码,但是我想知道是否已经有办法自动完成它,即如果我将HTTP Bad Request作为AJAX响应捕获,我想从响应体中取出模型状态错误并将它们插入到不引人注目的验证.
我正在寻找完整的推荐解决方案,而不是解决方法:)
谢谢!
我正在使用默认的MVC路由设置:
Run Code Online (Sandbox Code Playgroud)routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
我将区域定义为:
public class AdministrationAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Administration";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Administration_default",
"Administration/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
我在那个区域有一个控制器:
namespace XXX.Areas.Administration.Controllers
{
public class CountryController : Controller
{
public ActionResult Index()
{
///
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我输入
/行政/国家 …
我正在尝试创建自定义html帮助程序,它将从XML文件中检索一些文本并在视图上呈现它.XML按层次结构组织,其中顶部节点表示控制器名称,遵循操作名称,然后是单个键.
目标是完成语法,例如:
@Html.Show("Title")
Run Code Online (Sandbox Code Playgroud)
帮助程序将从调用它的视图中推断出控制器名称和操作名称.
有没有办法在html帮助扩展方法中获取该信息?
我已经构建了一个方法,如果在属性上找到属性,则返回一个属性实例:
public static U GetPropertyAttribute<T, TProperty, U>(this T instance, Expression<Func<T, TProperty>> propertySelector, U attribute) where U : Attribute
{
return Attribute.GetCustomAttribute(instance.GetType().GetProperty((propertySelector.Body as MemberExpression).Member.Name), typeof(U), true) as U;
}
Run Code Online (Sandbox Code Playgroud)
为了获取实例,我必须调用:
var cc = new CustomClass();
cc.GetPropertyAttribute(x => x.Name, new NullableAttribute())
Run Code Online (Sandbox Code Playgroud)
它工作正常,我得到属性类的确切实例.
但是,我不喜欢我必须使用新的NullableAttribute()作为参数,我想调用如下:
cc.GetPropertyAttribute<NullableAttribute>(x => x.Name)
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用,因为只要我删除第二个参数并在方法名称中添加1个泛型类型,它就开始需要其他两个.有没有办法强制该方法推断3个通用参数中的2个?即我想指定属性类,但不想指定类名和属性名.
更新:
这是实现的代码,感谢Jon,以及字符串解决方案的代码.我决定嵌套这个类,这样如果我为其他扩展类引入相同的方法,我就不会对命名空间进行轮询.
public static class AttributeExtensions
{
public static ObjectProperty<T, TProperty> From<T, TProperty>(this T instance, Expression<Func<T, TProperty>> propertySelector)
{
return new ObjectProperty<T, TProperty>(instance, propertySelector);
}
public class ObjectProperty<T, TProperty>
{
private readonly T instance;
private …Run Code Online (Sandbox Code Playgroud) 我期待一个内容类型设置为的POST请求:
内容类型:application/x-www-form-urlencoded
请求正文如下所示:
如first_name =约翰&姓氏=香蕉
我对控制器的操作有这个签名:
[HttpPost]
public HttpResponseMessage Save(Actor actor)
{
....
}
Run Code Online (Sandbox Code Playgroud)
Actor类的位置为:
public class Actor
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法强制Web API绑定:
first_name => FirstName
last_name => LastName
我知道如何使用内容类型设置为application/json但不使用urlencoded的请求来执行此操作.
我即将在服务器应用程序上编写一组方法,这些方法接收从TCP套接字接收的消息,对它们进行编码/解码,并加密/解密它们.
考虑消息被定义为特殊类型,每个都有自己的属性和总长度,我需要选择以下解决方案之一:1.制作使用泛型的方法,例如Encode<T>(...) where T : IMessage然后为每种类型的实现编码器/解码器消息,并有ResolveEncoder<T>将挑选编码器被通缉的消息或2.使用任何类型的消息的制作方法,只要它实现IMessage,比如Encode(IMessage message),用的System.Reflection决定一切,我需要了解它.
我对解决方案#2更感兴趣,因为它使我的代码缩小了30倍.但是,我担心不断反映属性是否会影响性能.现在由于时间限制完成项目,我无法真正"实验".
我将非常感谢任何个人经验或与基准测试相关的性能与任何一种解决方案的关系.
c# ×5
generics ×2
reflection ×2
.net ×1
.net-core ×1
ajax ×1
asp.net-core ×1
asp.net-mvc ×1
expression ×1
html-helper ×1
transactions ×1
validation ×1