15

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

概括

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

细节

在过去的 6 个多月里,我一直在制作 ASP.NET MVC 应用程序,这些应用程序使用存储库模式实现了 Unit Of Work 模式。最重要的是,我一直在对所有这些 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 场景的正确生命周期。
  • 上下文将只存在一次,每个请求命中网络服务器。

科尔。

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

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

问题是,所有解析器都共享此上下文,这在整个商店中都严重引发了错误。

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

因此,我现在将上下文注册表调整为以下内容:-

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 秒后返回。

每一个被解析的文件都应该是它自己的线程吗?然后为每个线程创建一个上下文?(我觉得类似于网络场景)。或者这样好吗?我知道它有很多上下文,但是每个上下文并不意味着与数据库的实时连接..并且使用连接池,这应该不是问题。

它有这么多上下文的原因是因为下面的代码......(这些是一些存储库类的单独构造函数......)

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

对于主要服务...

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

因此该服务需要一个 UoW 并且每个存储库也需要一个 ..这意味着正在为每个存储库创建一个新的。

我确定我的结构不正确...

任何建议将不胜感激!

4

1 回答 1

3

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

于 2010-02-21T08:08:02.207 回答