我一直在探索BDD/DDD,因此试图找到Repository模式的正确实现.到目前为止,很难就实现这一点的最佳方式达成共识.我试图将其归结为以下变化,但我不确定哪种方法最好.
作为参考,我正在构建一个以NHibernate作为后端的ASP.MVC应用程序.
public interface IRepository<T> {
// 1) Thin facade over LINQ
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Remove(T entity);
IQueryable<T> Find();
// or possibly even
T Get(Expression<Func<T, bool>> query);
List<T> Find(Expression<Func<T, bool>> query);
}
public interface IRepository<T> {
// 2) Custom methods for each query
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Remove(T entity);
IList<T> FindAll();
IList<T> FindBySku(string sku);
IList<T> FindByName(string name);
IList<T> FindByPrice(decimal price);
// ... and so on
}
public …Run Code Online (Sandbox Code Playgroud) 对我来说,经典的智慧是将枚举值(OrderStatus,UserTypes等)存储为数据库中的查找表.这使我可以在数据库中强制执行数据完整性,防止出现false或null值等.
但是越来越多,这对我来说就像是不必要的重复.我不仅需要为这些值创建表(或者有一个笨重的中央查找表),但如果我想添加一个值,我必须记住将它添加到2(或更多,计算生产,测试,实时数据库) )事情可能很容易失去同步.
我仍然很难放弃查找表.
我知道可能有某些情况下一个人比另一个人有优势,但你的一般想法是什么?
我正在尝试使用ASP.NET MVC项目首次实现DDD,而我正在努力解决一些问题.
我有2个相关实体,一个公司和一个供应商.我最初的想法是公司是一个集合根,供应商是公司的价值对象.所以我有一个公司的存储库,没有供应商的存储库.
但是当我开始构建我的应用程序时,我最终需要为供应商单独列出,创建和更新表单.这个名单很容易我可以打电话给Company.Suppliers,而且创建很糟糕我可以做Company.Suppliers.Add(供应商),但更新让我很头疼.由于我只需要一个实体,而且我无法将它完全固定在表单之间的内存中,我最终需要重新获取公司和所有供应商并找到我需要绑定到它的那个并再次修改它并坚持下去回到db.
如果我有供应商的存储库,我真的只需要做一个GetOne.我可以通过向我的公司或CompanyRepository添加GetOneSupplier来添加一些解决方法,但这看起来很垃圾.
所以,我真的想知道它是否真的是一个价值对象,而不是一个完整的域实体本身.
tldr;
是否需要单独的列表/创建/更新视图/页面,表明实体应该是它自己的根?
有没有办法让UpdateModel或TryUpdateModel将货币或货币格式化的值(例如$ 1,200.00)解析为小数而不会破坏块?
我正在努力解决ASP.NET MVC中缺少CheckBoxList的问题.我已经达到了可以渲染Enum值列表的程度,但我仍然坚持如何根据我的模型设置checked属性 - 在这种情况下,是一个具有IList of Role实体的User实体.角色id对应于枚举值.
此示例使用Spark View Engine语法,但它在功能上与标准ASP.NET MVC视图引擎相同("$("与"<%="或"<%"相同)
<for each="var r in Enum.GetValues(typeof(UserRole))">
<label><input type="checkbox" name="Roles" value="${(int)r}" checked="[How-The-Heck-To-I-Get-This?]" />${r}</label>
</for>
Run Code Online (Sandbox Code Playgroud) 我一直试图让(Ninject 3+)的Ninject.Extensions.Conventions工作,没有运气.我把它归结为一个找到的样本控制台应用程序,我甚至无法做到这一点.这就是我所拥有的:
class Program
{
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind(x => x
.FromThisAssembly()
.SelectAllClasses()
.BindAllInterfaces());
var output = kernel.Get<IConsoleOutput>();
output.HelloWorld();
var service = kernel.Get<Service>();
service.OutputToConsole();
Console.ReadLine();
}
public interface IConsoleOutput
{
void HelloWorld();
}
public class ConsoleOutput : IConsoleOutput
{
public void HelloWorld()
{
Console.WriteLine("Hello world!");
}
}
public class Service
{
private readonly IConsoleOutput _output;
public Service(IConsoleOutput output)
{
_output = output;
}
public void OutputToConsole()
{
_output.HelloWorld();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了各种组合的 FromAssembliesMatching …
我有一种情况,我希望使用较低的下划线映射到pascal单向,但pascal低于另一种方式.我的理解是,配置文件可以做到这一点,但我正在努力让它工作.这就是我所拥有的:
Mapper.Initialize(cfg =>
{
cfg.AddProfile<FromUnderscoreMapping>();
cfg.AddProfile<ToUnderscoreMapping>();
});
Mapper.CreateMap<ArticleEntity, Article>().WithProfile("FromUnderscoreMapping");
...
public class FromUnderscoreMapping : Profile
{
protected override void Configure()
{
SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
DestinationMemberNamingConvention = new PascalCaseNamingConvention();
}
public override string ProfileName
{
get { return "FromUnderscoreMapping"; }
}
}
public class ToUnderscoreMapping : Profile
{
protected override void Configure()
{
SourceMemberNamingConvention = new PascalCaseNamingConvention();
DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();
}
public override string ProfileName
{
get { return "ToUnderscoreMapping"; }
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置Xamarin.Forms SearchBar的样式,我可以看到有一个BackgroundColor属性,但无论我设置什么,该属性在iOS中被忽略.
甚至可以在iOS中定制Xamarin.Forms SearchBar(以及如何)?
我正在将一个从VB6移植到C#的应用程序.我发现一个特别是导致我出现问题的计算.它基本归结为
opperandA *.01 / opperandB
Run Code Online (Sandbox Code Playgroud)
我的具体例子是:
1 * .01 / 12
Run Code Online (Sandbox Code Playgroud)
在VB6(和Windows计算器)中,我得到8.3333333333e-4.
但是,在C#(和其他所有计算器)中,我得到.00083333.
第二个数字对我来说很有意义,但我必须复制第一个结果并且我想了解它,那么为什么VB6和Windows计算器会产生奇怪的结果呢?
c# ×6
asp.net-mvc ×3
bdd ×2
automapper ×1
calculator ×1
database ×1
ios ×1
mapping ×1
ninject ×1
vb6 ×1
xamarin ×1