public class ClientOfPdfObject<T> where T: PdfObject
{
public List<T> GetItems()
{
List<PdfObject> list = GetList();
var result = new List<T>();
foreach (var pdfObject in list)
{
if (typeof (T) == pdfObject.GetType())
result.Add((T) pdfObject);
}
return result;
}
//Get PdfObjects somewhere (ex. Db)
private List<PdfObject> GetList()
{
var list = new List<PdfObject>
{
new PdfImage(),
new PdfImage(),
new PdfImage(),
new PdfText(),
new PdfText(),
new PdfText(),
new PdfText()
};
return list;
}
}
static void main()
{
var text = new ClientOfPdfObject<PdfText>();
//contains 4 itmes (PdfText)
var pdfTexts = text.GetItems();
var image = new ClientOfPdfObject<PdfImage>();
//contains 3 items (PdfImage)
var pdfImages = image.GetItems();
}
和使用存储过程访问数据的代码:
ALTER PROCEDURE dbo.bicrudlogin
(
@id int,
@username nvarchar(50),
@password nvarchar(50),
@type varchar(50),
@status varchar(50)
)
AS
if(@status='insert')
Begin
insert into tbllogin values(@username,@password,@type)
End
if(@status='select')
Begin
select type from tbllogin where username=@username and password=@password
End
if(@status='update')
Begin
update tbllogin set username=@username,password=@password,type=@type where id=@id
End
if(@status='delete')
Begin
delete from tbllogin where id=@id
End
RETURN
如果这是错误的方式,那么告诉我该怎么做。
而不是为每个操作编写单独的存储过程。
答案 0 :(得分:0)
哇,如果这是生产代码,那么我真的很担心,但这是一个非常广泛的问题,我会尽力回答。通常,您会将您的读写问题分开,例如:
public interface IGetUserQuery
{
User Execute(string username, string password);
}
public class GetUserQuery : IGetUserQuery
{
public User Execute(string username, string password)
{
// your code
}
}
CREATE PROCEDURE uspGetUser (@username nvarchar(50),@password nvarchar(50))
AS
select type from tbllogin where username=@username and password=@password
public interface IAddUserCommand
{
void Execute(string username, string password, string type);
}
public class AddUserCommand : IAddUserCommand
{
public void Execute(string username, string password, string type)
{
// your code
}
}
CREATE PROCEDURE uspAddUser (@username nvarchar(50),@password nvarchar(50),@type varchar(50),@status varchar(50))
AS
insert into tbllogin values(@username,@password,@type)
这是如何获取用户的示例。但为什么这么精细?简单的答案是,这允许您对代码进行单元测试,即mock
您希望从查询中获得的内容并驱动软件的行为。您的存储过程应该是愚蠢的,并作为获取和转储数据的手段。你所拥有的逻辑应放在代码中。当它位于存储过程中时,这变得更难以维护并且经常导致更大的问题,因为您不知道有多少组件,即您的软件的一部分正在使用该sproc。如果进行微小更改,可能会影响多个组件。通过代码,您可以找到这个,因为如果您更改合同,您将收到编译错误。您也希望单元测试覆盖率也能找到问题。