【问题标题】:web forms, autofac, EF newing up models?网络表单、autofac、EF 更新模型?
【发布时间】:2016-04-05 12:37:10
【问题描述】:

我计划使用依赖注入重新设计我公司的网络发布平台,因为编码参考开始变得有点复杂。

在我的研究中,我发现了很多关于 MVC 的示例,但我们目前的意图是重新设计 Web 平台的业务逻辑、DAL、Core 等,并尽可能减少 UI 干预。

web平台的架构如下

  1. SQL 数据库
  2. DAL (EF6)
  3. 从 dal (poco) 中分离模型
  4. 业务逻辑
  5. CMS 系统
  6. 前端(网站)

所有独立的项目都有自己的关注点,但在两者之间被大量引用。

在我为抵消大量引用和耦合的研究中,我选择并遵循了以下示例 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);
}

我的问题是: 关于网络表单,这可以吗?还是我需要抽象模型才能在没有“new”关键字的情况下注入新的数据类

既然使用“new”关键字不会解耦我的数据模型,你会如何做到解耦/ioc/di?

【问题讨论】:

  • 我认为您没有正确理解依赖注入,第一个示例中的国家实体尚未注入方法中,它已作为参数传入..它看起来像_countryService 类已被注入。因此,在您的 Web 表单中,只需接受一个参数并注入另一个 _countryService 类。
  • 所以你关心的是new Country()?我假设Country 是一个简单的模型,对吧?
  • 忘了提及你刚刚做了什么。MVC 正在更新国家的实例并作为参数作为已填充的数据类传递。
  • 是的@YacoubMassad 我想避免更新simlpe数据类..
  • 这是有原因的吗?

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


【解决方案1】:

我认为这很好。 MVC 框架所做的所有事情就是更新Country 的实例并将请求参数与模型的属性相匹配。你可能会发现一个库在 web 表单中做同样的事情,但它可能是矫枉过正的。

您可以使用factory 来抽象出新的更新,但它可能不适用于您在这里遇到的情况。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • Country 是一个 poco,简单的 db 表示.. 那么 newup 可以吗?
    • 很可能是的。您可以在问题中包含它的定义,这样更容易确认。
    【解决方案3】:

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

    也就是说用new关键字手动创建实体是可以的,只要你不在用户界面类中这样做,对于web表单你可以使用Model View Presenter结合现代Model Binding 可用于 Asp.NET Web 窗体的技术。演示者实例化实体并与持久性机制(在您的情况下为 EF)进行交互。

    您可以将 UI 代码与演示代码分离,演示者可以存在于自己的程序集中并与视图接口一起使用,因此您将使用 IoC 注入具体实现。

    这是一个非常基本的示例框架,用于表示上述示例基础架构:

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

    我构建的服务是关于封装业务逻辑应用程序逻辑等。同样,您必须通过工作来避免硬引用这些服务的具体实现使用接口并通过一些 IoC 注入具体实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 2016-08-05
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      相关资源
      最近更新 更多