我有一个像这样的分层类结构:
类别 - >模板 - >实例
一个类别包含多个模板,一个模板包含多个实例.
如果我通过所有3个表的连接查询数据库中的数据,则数据如下所示:
CategoryID | CategoryName | CategoryType | TemplateID | TemplateName | TemplateXYZ | InstanceID | InstanceName
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 1 | "InstA"
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 2 | "InstB"
1 | "CatA" | "TypeX" | 1 | "TempA" | "X" | 3 | "InstC"
1 | "CatA" | "TypeX" | 1 | "TempB" | "Y" | …Run Code Online (Sandbox Code Playgroud) 我希望我的数据访问层可以非常模块化地构建.
因此,我有数据检索方法,有时直接从业务层调用,有时由其他数据检索方法调用以创建对象依赖项.
在DAL中处理数据库连接的最佳方法是什么?
a)在每个方法中创建一个新连接,然后再处理它.
好:易于编写和使用.
坏:许多连接正在打开和关闭.(性能?)
b)将连接作为(可选)参数传递.
好:我可以为多个命令重用开放连接.
不好:我必须跟踪连接的所有权(谁必须关闭它?)并且不能使用非常简洁的"使用"语句.
c)还有别的吗?(单身连接可能?)
这是我第一次写一个真正的DAL,所以我真的可以从经验丰富的人那里得到一些帮助.
编辑:因为它似乎很重要,它是一个ASP.Net网站项目.
是否可以在aspx-File中注册一个完整的usercontrol名称空间,而不是单独的每个控件?
我创建了一堆usercontrols并将它们收集到一个自己的命名空间"MyWebControls"中,如下所示:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="LevelFilter.ascx.cs" Inherits="MyWebControls.LevelFilter" %>
Run Code Online (Sandbox Code Playgroud)
代码隐藏:
namespace MyWebControls
{
public partial class LevelFilter : System.Web.UI.UserControl
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我现在尝试将它们包含在我的页面中(以及什么不起作用):
<%@ Register Namespace="MyWebControls" TagPrefix="ucs" %>
...
<ucs:LevelFilter />
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?显然它适用于像AjaxControlToolkit这样的外部程序集,所以我想这应该是可能的.
我使用的是ASP.NET 4.0.
我正在System.Net.Sockets.UdpClient类的帮助下开发一个动作多人游戏.
它适用于两个玩家,因此应该打开服务器并等待传入的连接.另一个玩家输入主机IP并尝试发送"ping",以确保连接是可能的并且有一个打开的服务器.然后主持人用"乒乓球"回应.
一旦游戏运行,两者都必须向对方发送udp消息,因此他们都需要对手的ip地址.
当然服务器也可以输入客户端IP,但这对我来说似乎是不必要的.
当收到"ping"消息时,如何从udp包中获取客户端IP?
这是我的接收代码(等待ping的服务器):
private void ListenForPing()
{
while (!closeEverything)
{
var deserializer = new ASCIIEncoding();
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] recData = udp.Receive(ref anyIP);
string ping = deserializer.GetString(recData);
if (ping == "ping")
{
Console.WriteLine("Ping received.");
InvokePingReceiveEvent();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用EF Code First,现在在实现自定义MembershipProvider时遇到了麻烦.
对于EF Code First,我创建了自己的用户类,如下所示:
public class User
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
public string UserName { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string Email { get; set; }
[Required]
public bool IsApproved { get; set; }
public DateTime? LastLoginDate { get; set; }
public DateTime? LastActivityDate { get; set; }
[Required]
public DateTime CreationDate { get; set; }
[Required]
public string ApplicationName { get; set; …Run Code Online (Sandbox Code Playgroud) c# asp.net entity-framework asp.net-membership membership-provider
我需要在用户通过下拉列表选择的条件之后过滤和排序数据条目.可选择的将是"最新条目优先","最早条目优先","最低价格优先"等.
我可以为选项和switch/case创建一个enum来检索数据,但我宁愿以一种容易扩展的方式来做这件事.
什么设计模式最适合这种情况?
我的一个(高级)同事在他的代码中做了一些非常奇怪的事情.
他没有检查变量是否为null,而是检查类型.因为
null是FooType
实际上返回false,这是有效的.
public class Foo
{
private string _bar = null;
public string Bar
{
get
{
// strange way to check for null
return (_bar is string) ? _bar : "";
}
set { _bar = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这是糟糕的编码,Resharper似乎同意我的看法.有没有理由以这种方式写支票?
这是检查变量的有效方法吗?或者这可以被认为是不好的风格,甚至可能在某些特殊情况下有害?
除非我确定这实际上没有意义,否则我不想与他对抗.
我有一个每 2 秒轮询一次 URL 的服务:
export class FooDataService {
...
public provideFooData() {
const interval = Observable.interval(2000).startWith(0);
return interval
.switchMap(() => this.http.get(this.requestUrl))
.map(fooData => fooData.json())
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个组件要在其中显示轮询数据:
export class FooComponent implements OnInit {
constructor(private fooDataService: FooDataService) {}
public fooData$: Observable<FooData>;
ngOnInit() {
this.fooData$ = this.fooDataService.provideFooData();
}
}
Run Code Online (Sandbox Code Playgroud)
在组件模板中,我将使用异步管道来检索值并将其传递给子组件:
<foo-data-viewer [data]="fooData$ | async"></foo-data-viewer>
Run Code Online (Sandbox Code Playgroud)
像这样实现它是无法用量角器进行测试的(请参阅我关于此主题或本文的最后一个问题)。所有代码都在 ngZone 内执行,量角器将等待所有排队的操作完成后再继续。但Observable.interval()会对无限数量的操作进行排队,从而导致量角器超时。
我最常读到的修复方法是runOutsideAngular这样使用:
export class FooComponent implements OnInit, OnDestroy {
constructor(private ngZone: NgZone,
private fooDataService: …Run Code Online (Sandbox Code Playgroud) 我有以下全局类型来启用故事书中的工具栏,让我选择主题:
export const globalTypes = {
theme: {
name: 'Theme',
description: 'Global theme',
defaultValue: MyTheme.Light,
toolbar: {
icon: 'mirror',
items: [MyTheme.Light, MyTheme.Dark],
showName: true,
dynamicTitle: true,
},
},
};
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以通过工具栏切换主题:
现在我想根据主题设置故事的背景颜色(正文的背景颜色),但我不知道如何为全球所有故事执行此操作。
我知道如何配置不同的背景颜色,但我不知道如何根据context.globals. 这是如何运作的?
如果我有一个可以同时出现的多个值的枚举,我创建一个Flags枚举:
[Flags]
public enum Foo
{
None = 0,
A = 1,
B = 2,
C = 4,
D = 8
}
Run Code Online (Sandbox Code Playgroud)
如果我现在想要传递每个值都设置的事实,我将不得不做这样的事情:
Bar bar = new Bar(Foo.A | Foo.B | Foo.C | Foo.D);
Run Code Online (Sandbox Code Playgroud)
添加额外元素All会被视为不良做法/有害/亵渎吗?
All = 15
Run Code Online (Sandbox Code Playgroud)
当存在大量值并且将它们全部传递时,这将节省一些空间和时间是常见的情况.
据我所知,标志枚举(=位域)的机制,这应该工作.我不知道有任何副作用或其他原因你不应该这样做吗?
c# ×8
.net ×4
asp.net ×3
angular ×1
connection ×1
database ×1
enum-flags ×1
enums ×1
linq ×1
namespaces ×1
null ×1
protractor ×1
reactjs ×1
rxjs ×1
storybook ×1
typescript ×1
udp ×1
udpclient ×1