【问题标题】:How should I be using IoC in this winform piece of code?我应该如何在这段 winform 代码中使用 IoC?
【发布时间】:2010-03-19 12:28:35
【问题描述】:

我在 Visual Studio 2010 中有一个 winform 应用程序。我的应用程序执行以下操作

  • 获取我需要读取数据然后插入数据库的文件列表。
  • 对于每个文件,读取数据并插入数据库。

所以..这是我的代码。

// *******
// *** How should the _repository be Injected??
// *******
var list = _repository.GetFileList();
if (list != null)
{
    int i = 0;
    foreach(var file in list)
    {
       i++;
       var service = new MyService(i, _repository);
       service.ParseAndSave();
    }
}

所以我希望为我创建的每个“服务”都有一个新的存储库。

首先,我不确定在这种情况下是否应该使用 IoC。我相信我应该这样做,因为这样我就不需要将此 winform 紧密耦合到存储库。

其次,我尝试使用 Singleton 存储库,但我不想要它并且可以确认它会杀死该代码(崩溃并出现异常)。

其他一些注释(不应该影响这个问题) - 使用 ASP.NET 4 的实体框架。 - 在 IoC 中使用 StructureMap

有人可以帮忙吗?

更新

哦,我忘了说。当我没有指定生命周期类型时(例如单例等)。我试图保存的对象,只是不保存。 (即没有任何东西发送到数据库,查看 SQL Profiler)。如果我使用带有一个文件的单例...它可以工作。具有 2 个以上文件的单例,然后由于(内部 EF)主键与实体框架冲突而导致异常/崩溃。因此,如果我应该使用单例,那么问题一定是我如何设置我的 EF4 上下文。

【问题讨论】:

  • 如果您怀疑您的 IOC 配置不正确,发布您的配置会有所帮助。
  • 我没有这样做,因为我不想影响答案 -> 我希望有人会在他们自己的 winform 示例中讨论他们所做的事情。是否有任何带有 Winform 的 IoC 的 SM 示例,您可能已经在某处提供了文档?

标签: .net winforms inversion-of-control structuremap repository-pattern


【解决方案1】:

您有两种基本选择:构造函数注入(如 Mark Seemann 的示例)或属性(setter)注入(容器支持,例如 Unity)

在 winform 的情况下,您需要使用允许使用默认构造函数的属性(setter)注入,或者再次按照 Mark 的建议,将表单用作数据的简单渲染器,在这种情况下,您应该可能考虑Model View Presenter pattern 的一些变体 (请注意链接中此模式已进一步细化和细分)

它的工作是查看MS Patterns and Practices Prism 项目的示例代码,了解一些使用 Unity 的 MVP 方法的示例

【讨论】:

    【解决方案2】:

    构造函数注入总是一个好的开始

    public MyClass(IRepository repository)
    {
        if(repository == null)
        {
            throw new ArgumentNullException("repository");
        }
    
        this.repository = repository;
    }
    

    但是,对于 Windows 窗体,您会遇到一个问题,即窗体类必须具有默认构造函数才能支持 Visual Studio 中的设计时功能。您可以通过确保您的 Forms are nothing more than dumb renderers of data 来解决此问题。

    【讨论】:

    • 是的 - 这一切都很好..我用我的 WebForms/ASP.NET MVC 应用程序来做到这一点......但是使用 winform?如何(以及使用结构图,以获得奖励积分)....(是的,我检查了该链接)。主要的是..我不能在表单上使用构造函数注入..因为在那个表单中,我的每个文件(我读)都需要它的 OWN 存储库..不是表单将拥有/使用的那个。
    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多