我觉得他们基本上都是一样的.模型对象也一样吗?
现在,在我的架构中,我有:
class Person
{
public string PersonId;
public string Name;
public string Email;
public static bool IsValidName() { /* logic here */ }
public static bool IsValidEmail() { /* logic here */ }
}
class PersonService
{
private PersonRepository pRepository;
PersonService()
{
pRepository = new PersonRepository();
}
public bool IsExistingEmail(string email)
{
//calls repo method to see if email is in db
}
public Person GetPerson(email)
{
return pRepository.Get(email);
}
public void SavePerson(Person p)
{
if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email) …Run Code Online (Sandbox Code Playgroud) 如果我有一个简单的查询,例如:
string sql = "SELECT UniqueString, ID FROM Table";
Run Code Online (Sandbox Code Playgroud)
我想将它映射到字典对象,例如:
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
Run Code Online (Sandbox Code Playgroud)
我怎么用Dapper这样做?
我假设它是这样的:
myDictionary = conn.Query<string, int>(sql, new { }).ToDictionary();
Run Code Online (Sandbox Code Playgroud)
但无法弄清楚正确的语法.
我创建了一个POCO模型类和一个处理持久性的存储库类.由于POCO无法访问存储库,因此存储库中有许多业务逻辑任务似乎不对.根据我的阅读,看起来我需要一个位于UI使用者和存储库层之间的服务层.我不确定的是它应该如何工作......
除了服务层,还应该有一个单独的业务逻辑层,还是那个服务层的角色?
每个存储库应该有一个服务吗?
服务层是UI可以实例化模型对象还是存储库为服务提供新模型实例的唯一方式?
我是否将我的参数,模型和其他验证放在服务层中进行检查以确保输入有效以及更新前数据库中是否存在要更新的项目?
模型,存储库和UI都可以调用服务层,还是仅供UI使用?
服务层应该是所有静态方法吗?
从UI调用服务层的典型方法是什么?
模型与服务层应该进行哪些验证?
以下是我现有图层的示例代码:
public class GiftCertificateModel
{
public int GiftCerticiateId {get;set;}
public string Code {get;set;}
public decimal Amount {get;set;}
public DateTime ExpirationDate {get;set;}
public bool IsValidCode(){}
}
public class GiftCertificateRepository
{
//only way to access database
public GiftCertificateModel GetById(int GiftCertificateId) { }
public List<GiftCertificateModel> GetMany() { }
public void Save(GiftCertificateModel gc) { }
public string GetNewUniqueCode() { //code has to be checked in db }
public GiftCertificateModel CreateNew()
{
GiftCertificateModel gc = new …Run Code Online (Sandbox Code Playgroud) c# asp.net domain-driven-design repository repository-pattern
例如,如果我正在创建3层应用程序(数据/业务/ UI),并且数据层正在抓取单个或多个记录.在发送到业务层之前,我是否将所有内容从数据层转换为通用列表/集合?发送数据表是否可以?将信息发送回数据层怎么样?
如果我使用对象/列表,那么这些是Data或Business层的成员吗?我可以使用相同的对象传递到图层吗?
这是一些伪代码:
对象用户使用电子邮件/密码
在UI层,用户输入电子邮件/密码.UI层进行验证,然后我假设创建一个新的对象用户传递给业务层,业务层进行进一步验证并将相同的对象传递给数据层以插入记录.它是否正确?
我是.NET的新手(来自8年以上的ASP VBScript背景)并试图以"正确"的方式加快速度.
我一直在阅读这本关于DDD的电子书,它说只有高度复杂的系统才适合DDD架构.这让我再次猜测我决定更多地将DDD作为我的架构.
我正在逐节将经典的ASP应用程序转换为.NET.它包括强大的产品分类方案和购物车,每天可获得约100-200个订单,以及类似于YouTube的视频部分(视频和社交功能,如评级,评论等).由于我已将其转换为块,因此我希望将站点的每个区域视为单独的项目.
该网站不断获得新功能,需要易于维护和更新.
现在我只是使用基本的自制ADO.NET DAL与BLL和DTO作为公共层.
在这个项目中使用与DDD不同的架构会更好吗?我是建筑学的新手,想要使用某种模式作为指导,我可以在整个转换过程中遵循这些模式,以避免可怕的意大利面条反模式.
如果不是DDD,那又怎样?仍在努力寻找一个好的方向.我需要快速,轻松地开始学习,而不是一个完整的专家,因为我还在学习.
我想找到一个解决方案或方法,允许我添加盐并控制迭代次数.原生Rfc2898DeriveBytes基于HMACSHA1.理想情况下,使用SHA-256或SHA-512将使系统面向未来.
这是我到目前为止找到的最好的例子:http://jmedved.com/2012/04/pbkdf2-with-sha-256-and-others/ 但是当我使用SHA-256运行它时它实际上比SHA-512.我使用64k迭代,一个盐的guid和不同长度的密码进行比较.
我也找到了这个解决方案:http: //sourceforge.net/projects/pwdtknet/ ,它有完整的源代码.它看起来更强大.
到目前为止,我无法从它们中获得相同的输出.
我有一个具体的存储库实现,它返回实体的IQueryable:
public class Repository
{
private AppDbContext context;
public Repository()
{
context = new AppDbContext();
}
public IQueryable<Post> GetPosts()
{
return context.Posts;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我的服务层可以根据其他方法(其中,分页等)的需要执行LINQ
现在我的服务层设置为返回IEnumerable:
public IEnumerable<Post> GetPageOfPosts(int pageNumber, int pageSize)
{
Repository postRepo = new Repository();
var posts = (from p in postRepo.GetPosts() //this is IQueryable
orderby p.PostDate descending
select p)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
return posts;
}
Run Code Online (Sandbox Code Playgroud)
这意味着在我的代码隐藏中,如果我想绑定到转发器或其他控件,我必须执行ToList().
这是处理返回类型的最佳方法,还是在从服务层方法返回之前需要转换为列表?
如果我有一个3层Web表单应用程序,它接受用户输入,我知道我可以使用表示层中的验证控件来验证该输入.我是否还应该在业务和数据层中进行验证,以防止SQL注入和问题?每层应该进行哪些验证?
另一个例子是传递ID以返回记录.数据层应该确保id有效还是应该在BLL/UI中发生?
我首先使用EF4代码,并拥有持久性存储库和与之交互的服务层.我有一个服务层方法,它在我的存储库上调用IQueryable方法并返回包含实体的IEnumerable.我还需要返回总记录数,以便我可以计算分页链接.
我应该如何从我的服务方法返回int和IEnumerable?
所有这些都应该有效,但哪一个最干净?
更新: 这是对架构的一些澄清.如果这是错误的,请告诉我更好的方法(例如 - 在表示层而不是服务层进行分页等)
回购层:
返回DbSet的IQueryable,从表示层抽象出db访问
服务层:
对IQueryable执行LINQ查询以进行过滤,并根据需要使用skip和take获取页面项并返回IEnumerable(返回时也设置为List以避免任何DbContext生命周期问题)
表示层:
在Service层上调用该方法(getPagedResults(filters,pageNumber,pageSize))
从它的外观来看,我还需要添加一个单独的方法来获得总结果.希望能在一个电话中完成这一切.
我宁愿不将所有记录带回演示文稿,然后页面......似乎效率低下.
我一直在试图找出处理默认值的最佳方法.将ID值设置为0是有意义的,但如果它是金钱值或其他未初始设置的值,当您在代码中稍后遇到它时,无法判断它是否已设置或设置为0.将money值设置为null,然后您知道它尚未设置.此外,在处理数据库时,很容易知道是否需要将空值写入字段而不是尝试确定它是否应该为空.
处理这个问题的方法是什么?
Class MyModel
{
public int Id {get;set;}
public string Title {get;set;}
public DateTime CreatedDate {get;set;}
public bool IsActive {get;set;}
//CLR will automatically set these values
Public MyModel()
{
Id = 0;
Title = String.Empty;
CreatedDate = "1/1/0001";
IsActive = false;
}
}
Run Code Online (Sandbox Code Playgroud)
VS
Class MyModel
{
public int? Id {get;set;}
public string Title {get;set;}
public DateTime? CreatedDate {get;set;}
public bool? IsActive {get;set;}
//CLR will automatically set these values
Public MyModel()
{
Id = null;
Title = null;
CreatedDate …Run Code Online (Sandbox Code Playgroud)