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

Pur*_*ome 15 .net dependency-injection unit-of-work repository-pattern winforms

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

摘要

在我的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(); 
        } 
    );    
} 
Run Code Online (Sandbox Code Playgroud)

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

  • 我假设生命周期是Web场景的正确生命周期.
  • 根据访问网络服务器的REQUEST,上下文只存在一次.

KEWL.

现在,对于我的WinForm应用程序,我最初创建了一个Unit Of Work对象(还没有依赖注入)并且不断地将该婴儿传递给所有服务(然后到存储库).

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

问题是,这个概念正在被所有的Parsers共享,这严重地在整个商店中引发了错误.

那么我添加了一些依赖注入并使用上面的注册表代码.排序相同 - 很多严重的错误.这是因为再次为单线程创建了一个上下文 - > 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(); 
    }); 
} 
Run Code Online (Sandbox Code Playgroud)

因此,对于WinForm应用程序,它现在不设置生命周期.这创造了大概160左右的上下文我认为!(但它也没有真正的错误).

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

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

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

它有这么多的背景下,原因是监守下面的代码......(这些都是独立的构造函数用于一些仓库类的...)

public SqlServerContext(string, string); 
public GameFileRepository (IUnitOfWork); 
public LogEntryRepository(IUnitOfWork); 
public AlertRepository(IUnitOfWork); 
... etc.. 
Run Code Online (Sandbox Code Playgroud)

并为主要服务......

public PunkBusterParser(IUnitOfWork, IGameFileRepositry, 
ILogEntryRepository, ILoggingService); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

jer*_*enh 3

Ayende 的这篇文章可能会为您提供一些有关如何在桌面应用程序中管理工作单元的见解(总体思路是使用“每个演示者的会话”):http://msdn.microsoft.com/en-us /杂志/ee819139.aspx