我在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上下文。
答案 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方法的示例