网页表单,autofac,EF新增模型?

时间:2015-12-31 15:01:00

标签: c# entity-framework dependency-injection webforms autofac

我计划使用依赖注入重写我的公司Web发布平台,因为编码引用开始变得有点复杂。

在我的研究中,我发现了很多关于MVC的例子,但我们目前的意图是重新设计网络平台的业务逻辑,DAL,核心等......用最少的UI干预。

网络平台的架构如下

  1. SQL数据库
  2. DAL(EF6)
  3. dal(poco)的分离模型
  4. 商业逻辑
  5. CMS系统
  6. 前端(网站)
  7. 所有分离的项目都有自己的顾虑,但在两者之间有很多参考。

    在我的研究中,为了抵消重度参考和耦合,我选择并遵循以下示例 techbrij blog post

    我确实理解抽象和依赖注入的概念,并设置了一个测试项目,但遇到了障碍。

    在MVC中,实例化新数据类(poco)由ActionResult

    处理
    // POST: /Country/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Country country)
    {
        // TODO: Add insert logic here
        if (ModelState.IsValid)
        {
            _CountryService.Create(country);
            return RedirectToAction("Index");
        }
        return View(country);
    }
    

    到目前为止,如果我们使用MVC那么好。但是如果我使用Webforms来插入新记录,我的逻辑说我需要从模型中实例化一个新类,用特定值填充其属性并将其传递给BLL / DAL或服务层:

    public void InsertRecord()
    {
        Country country = new Country();
        country.Name = "Some Country"; // or value from textbox..
    
        _CountryService.Create(country);
    }
    

    我的问题是: 关于webforms,这是正常还是我需要取消模型以便在没有“new”关键字的情况下注入新数据类

    由于使用“new”关键字不能解耦我的数据模型,你将如何实现解耦/ ioc / di?

3 个答案:

答案 0 :(得分:0)

我觉得这很好。所有MVC框架正在做的是新建一个Country的实例,并将请求参数与模型的属性相匹配。您可能会发现一个在webforms中执行相同操作的库,但它可能会有点过分。

您可以使用factory抽象出新的内容,但可能不适合您在这里的情况。

答案 1 :(得分:0)

看看this article。它区分了Injectables和Newables。

在我的理解中,Injectables是一些类,它们使用DI来呈现您想要改变的行为。虽然Newables是主要包含数据的简单类。它们可能包含这些类内部的一些行为(不需要外部服务),因此您不希望使用DI来改变这种行为。

在我看来,Country类是一个新的。因此,通过new新建它是完全正常的。

答案 2 :(得分:0)

您提供的链接使用存储库模式,我个人远离它,因为它是关于隐藏您的持久性工具,如果您隐藏您的武器库,您将失去它提供的功能,除了可能不必要的增加的复杂性。

那说可以手动创建带有 new 关键字的实体,只要你不在用户界面类中做到这一点,对于可以使用Model View Presenter组合的网络表单使用现代Model Binding技术可用于Asp.NET Web窗体。 Presenter实例化实体并与持久性机制(在您的情况下为EF)进行交互。

您可以将UI代码与表示代码分离,演示者可以使用自己的程序集并使用View Interfaces,因此您将使用IoC注入具体实现。

以下是代表上述示例基础结构的非常基本的示例框架:

public interface IView{}
public abstract Presenter<T> where T : IView
{
  public Presenter( T view){ View = view;}
  public T View {get;set;}
}

我构建的服务是关于封装业务逻辑应用程序逻辑等。再次,您将需要通过工作避免对这些服务的具体实现的硬性引用使用接口并使用一些IoC注入具体实现。