我之前的问题让我再次思考层,存储库,依赖注入和这样的架构.
我的架构现在看起来像这样:
我首先使用EF代码,所以我只创建了POCO类和上下文.这创建了db和model.
级别更高的是业务层类(提供者).我为每个域使用不同的提供程序...比如MemberProvider,RoleProvider,TaskProvider等.我在每个提供程序中创建我的DbContext的新实例.
然后我在我的控制器中实例化这些提供程序,获取数据并将它们发送到Views.
我的初始架构包括存储库,我之所以摆脱它是因为我被告知它只会增加复杂性,所以为什么我不仅仅使用EF.我想这样做..直接从控制器使用EF,但我必须编写测试,它与真正的数据库有点复杂.我不得不假装 - 以某种方式模拟数据.因此,我为每个提供商创建了一个接口,并使列表中的硬编码数据成为假提供者.有了这个,我回到了一些东西,我不知道如何正确地进行.
这些事情开始过于复杂化......许多方法和"模式"......它产生了太多的噪音和无用的代码.
是否有任何SIMPLE和可测试的体系结构用于使用Entity Framework创建和ASP.NET MVC3应用程序?
architecture asp.net-mvc unit-testing entity-framework code-first
我承认,我没有经过单元测试......但我想.话虽如此,我有一个非常复杂的注册过程,我想优化,以便更容易进行单元测试.我正在寻找一种方法来构建我的类,以便将来可以更轻松地测试它们.所有这些逻辑都包含在MVC框架中,因此您可以假设控制器是从中实例化所有内容的根.
为了简化,我实际上要问的是如何设置一个系统,您可以使用CRUD更新管理任意数量的第三方模块.这些第三方模块都是RESTful API驱动的,响应数据存储在本地副本中.删除用户帐户之类的东西需要触发删除所有相关模块(我称之为提供者).这些提供者可能依赖于另一个提供者,因此删除/创建的顺序很重要.我对我应该专门用来支持我的应用程序的设计模式感兴趣.
注册跨越多个类并将数据存储在多个db表中.这是不同提供者和方法的顺序(它们不是静态的,只是为了简洁起见):
Provider::create('external::create-user')在特定提供商的特定步骤启动注册.第一个参数中的双冒号语法表示该类应该触发创建providerClass::providerMethod.我提出了一个一般假定Provider将与方法的接口create(),update(),delete()所有其他供应商将实现它.如何实例化这可能是你需要帮助我的东西.$user = Provider_External::createUser() 在外部API上创建用户,返回成功,用户存储在我的数据库中.$customer = Provider_Gapps_Customer::create($user) 在第三方API上创建客户,返回成功并在本地存储.$subscription = Provider_Gapps_Subscription::create($customer) 在第三方API上创建与先前创建的客户关联的订阅,返回成功并在本地存储.Provider_Gapps_Verification::get($customer, $subscription)从外部API检索行.该信息存储在本地.另一个电话是我正在跳过以保持简洁.Provider_Gapps_Verification::verify($customer, $subscription)执行外部API验证过程.其结果存储在本地.这是一个非常愚蠢的样本,因为实际代码依赖于至少6个外部API调用和10个本地数据库行在注册期间创建.在构造函数级别使用依赖注入是没有意义的,因为我可能需要在控制器中实例化6个类,而不知道我是否甚至需要它们.我想要完成的事情就像Provider::create('external')我只是指定启动注册的起始步骤.
如您所见,这只是注册过程的一个示例.我正在构建一个系统,我可以拥有数百个服务提供商(外部API模块),我需要注册,更新,删除等.这些提供商中的每一个都与用户帐户相关联.
我想以一种方式构建这个系统,我可以在触发创建新提供程序时指定操作顺序(步骤).换句话说,允许我指定在事件链中接下来触发哪个提供者/方法组合,因为创建可以跨越这么多步骤.目前,我通过主题/观察者模式发生了这一系列事件.我希望可能将此代码移动到数据库表,provider_steps在此列出每个步骤以及它的跟随success_step和failure_step(对于回滚和删除).该表如下所示:
# the id of the parent provider row
provider_id int(11) unsigned primary key,
# the short, slug name of the step for using in codebase
step_name varchar(60), …Run Code Online (Sandbox Code Playgroud) 我正在创建实体(实体 - 视图 - 控制器)(换句话说,MVC模型)类,它理论上与我拥有的数据库表匹配.有没有一个工具可以读取mysql表并创建一个模型类代码?(不执行时,需要输出代码)我希望输出像
class{
public $columnname1;
public $columnname2;
public $columnname3;
public $columnname4;
public $columnname5;
public $columnname6;
function __construct(&$columnname1, &$columnname2){...}
function insert(&$columnname1, &$columnname2){}
function delete(&$columnname1){}
...
}
Run Code Online (Sandbox Code Playgroud)
一个也可以通过id函数创建插入,更新和删除的工具对我有很大的帮助.
该工具可以是免费的或付费的.
我发现自己做了很多工作来获得nHibernate设置,我想知道:为什么要使用像Hibernate/NHibernate这样的框架?我相信很多人都喜欢这个框架,但我不清楚其优缺点.延迟加载有哪些优点和缺点,Hibernate还有其他功能吗?有没有什么能使这样的框架更容易使用(最佳实践,其他框架等)?
这里有很多问题要问'我应该用什么样的ORM用x和y',但我没有看到任何特别询问如何选择一个.相关:为什么要使用ORM?,我应该将什么ORM用于ASP.Net MVC项目?,有没有充分的理由不使用ORM?和更多.
世界上有很多ORM.我想知道如何比较它们.我听说过活动记录模型和领域模型之类的东西,我不确定这些是什么意思.那么我可以用一套好的标准来比较一个ORM到另一个ORM?
如果您想知道,我们的环境是C#,MVC,SQL Server.
可能重复:
有没有充分的理由不使用ORM?
你为什么要使用ORM?
您好,我在SQL开发多年(许多不同的SQL服务器,如Oracle,MSSql,Mysql),我一直很高兴这样做.我最近看到很多关于ORM的东西,我问我为什么要走向这个世界.你能不能花时间学习一种不同的方式来做我今天已经做过的事情,能给我一些好处吗?在此先感谢c.
我有这样的代码
public class People
{
public string name { get; set; }
}
public class Animal
{
public string age { get; set; }
}
class Test
{
public void DataPeopleList()
{
string sql = "SELECT * FROM People";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();
List<People> list = new List<People>();
while (rdr.Read()) {
People p = new People();
p.name = rdr["name"].ToString();
list.Add(p);
}
rdr.Close();
}
public void DataAnimalList()
{
string sql = "SELECT * FROM Animal"; …Run Code Online (Sandbox Code Playgroud) nhibernate ×2
oop ×2
orm ×2
php ×2
unit-testing ×2
architecture ×1
asp.net ×1
asp.net-mvc ×1
c# ×1
code-first ×1
dependencies ×1
hibernate ×1
linq-to-sql ×1
mysql ×1
sql ×1