我应该如何在这个winform代码片段中使用IoC?

时间:2010-03-19 12:28:35

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

我在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 repo,我不想要它并且可以确认它会杀死那些代码(崩溃时有例外)。

其他一些注意事项(不应影响此问题)    - 使用ASP.NET实体框架4。    - 使用StructureMap for IoC

有人可以帮忙吗?

更新

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

2 个答案:

答案 0 :(得分:0)

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

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

    this.repository = repository;
}

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

来解决此问题

答案 1 :(得分:0)

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

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

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