不确定如何在WinForm应用程序中使用依赖注入+存储库模式+工作单元模式

时间:2010-02-21 00:06:00

标签: .net winforms dependency-injection repository-pattern unit-of-work

(为文字墙道歉... :))

摘要

在我的Winfor应用程序中使用依赖注入正在创建大量的存储库上下文。我不确定我使用它的方式是对还是错,或者通常的做法是什么。

详细信息

在过去的6个月里,我一直在制作ASP.NET MVC应用程序,这些应用程序使用Repository Pattern来实现Unit O fWork模式。除此之外,我一直在所有这些Web应用程序上使用依赖注入,并取得了一些成功。

所以这是我连接我的存储库的一个例子。

public EntityFrameworkRepositoryRegistry() 
{ 
    For<IUnitOfWork>() 
            .HybridHttpOrThreadLocalScoped() // Lifecycle of the object.
            .Use<SqlServerContext>()  // My EF Context.
            .Ctor<string>("connectionString").Is("name=SqlServer_EF")
            .Ctor<string>("defaultContainerName").Is("Entities"); 

    // Ayende's EFProf application :) 
    EntityFrameworkProfiler.Initialize();      

    Scan(x => 
        { 
            x.TheCallingAssembly(); 

            x.ExcludeNamespaceContainingType<Fake.FakeContext>(); 

            x.WithDefaultConventions(); 
        } 
    );    
} 

好的 - 效果很好。 这里要注意的主要是

  • 我假设生命周期是Web场景的正确生命周期。
  • 上下文只会存在一次,每次REQUEST命中 网络服务器。

KEWL。

现在,对于我的WinForm应用程序,我最初创建了一个 工作单位对象(没有依赖注入,还没有)并继续传递给那个婴儿 所有服务(然后到存储库)。

对于这个win应用程序,它会命中数据库找出所有文本 需要解析的文件。 (例如,25个文件)。然后,对于每个文件,它 创建一个新的Parser,读取每一行并将解析后的数据放入其中 一个db表。精细。

问题是,这个概念正在被所有分析者共享,其中 整个商店都在严重抛出错误。

然后我添加了一些依赖注入并使用上面的注册表代码。排序相同 - 很多严重的错误。这是因为再次为单线程创建了一个上下文 - &gt; winform。

所以,我现在将Context的注册表调整为: -

public EntityFrameworkRepositoryRegistry(bool isForTheWeb) 
{ 
    if (isForTheWeb) 
    { 
        For<IUnitOfWork>() 
            .HybridHttpOrThreadLocalScoped() 
            .Use<SqlServerContext>() 
            .Ctor<string>("connectionString").Is("name=SqlServer_EF") 
            .Ctor<string>("defaultContainerName").Is("Entities"); 
    } 
    else 
    { 
        For<IUnitOfWork>() 
            .Use<SqlServerContext>() 
            .Ctor<string>("connectionString").Is("name=SqlServer_EF") 
            .Ctor<string>("defaultContainerName").Is("Entities"); 
    } 

    EntityFrameworkProfiler.Initialize(); 

    Scan(x => 
    { 
        x.TheCallingAssembly(); 

        x.ExcludeNamespaceContainingType<Fake.FakeContext>(); 
        x.WithDefaultConventions(); 
    }); 
} 

因此,对于WinForm应用程序,它现在不设置生命周期。这个 然后创造了约160左右的上下文我认为! (但事实并非如此 错误,或)。

所以,我不确定这是否是正确的做事方式。

因此,我的应用程序实际上有25个不同的计时器,用于检查文件 每个...说.. 10秒。如果有新数据,它会解析它。 否则,在10秒内回来。

如果这些文件中的每一个都被解析,那么它是自己的线程吗? 然后为每个线程创建一个上下文? (我觉得类似于 网络情景)。或者这很好吗?我知道这是很多背景,但是 每个上下文并不意味着与db ...的实时连接 连接池,这应该不是一个问题。

它有这么多背景的原因是由于以下原因 代码...(这些是一些单独的构造函数 存储库类......)

public SqlServerContext(string, string); 
public GameFileRepository (IUnitOfWork); 
public LogEntryRepository(IUnitOfWork); 
public AlertRepository(IUnitOfWork); 
... etc.. 

和主要服务......

public PunkBusterParser(IUnitOfWork, IGameFileRepositry, 
ILogEntryRepository, ILoggingService); 

所以该服务需要一个UoW,每个存储库也需要 一个..这意味着每个人都会创建一个新的。

我确定我没有正确构建这个......

任何建议都会真诚地感激不尽!

1 个答案:

答案 0 :(得分:3)

Ayende撰写的这篇文章可能会为您提供有关如何在桌面应用程序中管理工作单元的一些见解(一般的想法是使用'每个演示者的会话'):http://msdn.microsoft.com/en-us/magazine/ee819139.aspx