社区首页 >问答首页 >如何使用Unity在每次处理旧实例时解析新实例

如何使用Unity在每次处理旧实例时解析新实例
EN

Stack Overflow用户
提问于 2010-11-13 21:21:19
回答 3查看 5.2K关注 0票数 2

我正试着开始使用Unity,但我的股票在一点上。

我有一个Context类和一个Repository类正在被容器解析。我的Repository类接受上下文ctor参数作为依赖项。

我的配置文件:

容器:

代码语言:javascript
代码运行次数:0
复制
  <register type="IGeneralContext" mapTo="Data.EF.EFContext, Data.EF">
    <lifetime type="singleton" />
    <constructor>
      <param name="connectionString">
        <value value="anyConnStr"/>
      </param>
    </constructor>
  </register>

  <register type="IClienteRepository" mapTo="Repository.EF.ClientRepository, Repository.EF">
    <constructor>
      <param name="context">
        <dependency type="Data.EF.EFContext, Data.EF"/>
      </param>
    </constructor>
  </register>

现在,我希望在调用Resolve时构造一个新的IGeneralContext实例,并且旧的实例已经发布。

请参见:

代码语言:javascript
代码运行次数:0
复制
using (IGeneralContext context = container.Resolve<IGeneralContext>()) //NEW CONTEXT INSTANCE
{
    IClienteRepository rep = container.Resolve<IClienteRepository>(); // USE DEPENDENCY AS SINGLETON
    Cliente nc = new Cliente() {  };
    rep.Add(nc);
    context.CommitChanges();
} // DISPOSE CONTEXT

using (IGeneralContext context = container.Resolve<IGeneralContext>()) //BRAND NEW CONTEXT INSTANCE
{
    IClienteRepository rep = container.Resolve<IClienteRepository>(); // USE DEPENDENCY AS SINGLETON
    Cliente nc = new Cliente() { };
    rep.Add(nc);
    context.CommitChanges();
} // DISPOSE CONTEXT

IClienteRepository rep1 = container.Resolve<IClienteRepository>(); // NEW CONTEXT AGAIN
Cliente cliente1= rep1.GetById(1);

你知道怎么用Unity解决这个问题吗?

Tks。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-16 14:46:53

在分析了更好的James建议后,我找到了一个很好的替代方案。

有一种新方法可以将实例化委托给工厂:

代码语言:javascript
代码运行次数:0
复制
        container.RegisterType<IMyInterface, MyConcrete>(new InjectionFactory(c => MyFactoryClass.GetInstance()));

也可以扩展配置文件来为您做这件事。

参见CodePlex上的ctavares帖子,他/她有一个非常好的例子。http://unity.codeplex.com/Thread/View.aspx?ThreadId=219565

票数 4
EN

Stack Overflow用户

发布于 2010-11-13 21:31:32

看一下StaticFactory扩展。您可以提供自己的对象创建方法,该方法允许您检测现有上下文是否仍然可用。

http://www.pnpguidance.net/post/RegisteringFactoryMethodCreateObjectsUnityStaticFactoryExtension.aspx

票数 1
EN

Stack Overflow用户

发布于 2010-11-14 00:55:30

你可能想退后一步,看看你的设计。我发现,大多数时候,我认为我需要一些复杂的DI配置,问题实际上出在我的设计中。这里有几个你可以考虑的选项:

1)使用工厂创建存储库,并将上下文提供给该工厂:

代码语言:javascript
代码运行次数:0
复制
var repositoryFactory = container.Resolve<IRepositoryFactory>();

using (var context = container.Resolve<IGeneralContext>())
{
    var rep = repositoryFactory.Create<IClienteRepository>(context);
    // ...
}

public class RepositoryFactory : IRepositoryFactory
{
    public TRepository Create<TRepository>(IGeneralContext context)
        where TRepository : IRepository
    {
        var repository = Container.Resolve<TRepository>();
        repository.Context = context;
        return repository;
    }
}

2)尝试将存储库作为上下文的一部分:

代码语言:javascript
代码运行次数:0
复制
using (var context = container.Resolve<IGeneralContext>())
{
    var nc = new Cliente() { };
    context.Clientes.Add(nc);
    // ...
}

如果无法将所有这些存储库属性放在上下文本身上,则可能需要创建一个包装器对象:

代码语言:javascript
代码运行次数:0
复制
using (var context = container.Resolve<NorthwindContext>())
{
    var nc = new Cliente() { };
    context.ClienteRepository.Add(nc);

    // ...
}

public class NorthwindContext
{
    private IGeneralContext context;
    private IRepositoryFactory repFactory;

    public NorthwindContext(IGeneralContext context,
        IRepositoryFactory repFactory)
    {
        this.context = context;
        this.repFactory = repFactory;
    }

    public IClienteRepository Clientes
    {
        get { return this.repFactory
            .Create<IClienteRepository>(this.context); }
    }

    public IOrderRepository Orders
    {
        get { return this.repFactory
            .Create<IOrderRepository>(this.context); }
    }

    public void CommitChanges()
    {
        this.context.CommitChanges();
    }
}

您可能还希望尽量减少对容器的调用量。尝试通过构造函数注入尽可能多的内容。

关于工作单元模式(= Here is an interesting SO question )和可能有帮助的存储库的上下文。

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4174780

复制
相关文章
netsh命令解析与实例使用
描述:netsh 命令在本地或者远程显示与修改当前正在运行的计算机的网络配置,为了存档、备份或者配置其他服务器, netsh也可以将配置脚本保存在文本文件中。 他们通过一个或者多个服务,实用程序或协议提供配置和监视支持来扩展Netsh的功能,并提供脚本功能,IP地址、网关、DNS、MAC地址,Context(上下文)是特定于网络组件一组命令。
全栈工程师修炼指南
2022/09/28
4.3K0
netsh命令解析与实例使用
netsh命令解析与实例使用
描述:netsh 在本地或者远程显示与修改当前正在运行的计算机的网络配置,为了存档、备份或者配置其他服务器, netsh也可以将配置脚本保存在文本文件中。 他们通过一个或者多个服务,实用程序或协议提供配置和监视支持来扩展Netsh的功能,并提供脚本功能,IP地址、网关、DNS、MAC地址,Context(上下文)是特定于网络组件一组命令。
全栈工程师修炼指南
2020/10/26
7.6K0
netsh命令解析与实例使用
net命令解析与实例使用
描述:NET命令它可以管理网络环境,服务,用户,登录的本地信息,它是对于Windows运维最常用的命令; 注:Win98与WinNT有不同的,但Winnet后期都差不多
全栈工程师修炼指南
2020/10/26
2.7K0
net命令解析与实例使用
net命令解析与实例使用
描述:NET命令它可以管理网络环境,服务,用户,登录的本地信息,它是对于Windows运维最常用的命令; 注:Win98与WinNT有不同的,但Winnet后期都差不多
全栈工程师修炼指南
2022/09/29
1K0
net命令解析与实例使用
Unity–Cinemachine官方实例详解
搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create 2D Camera,在生成的相机中设置follow,同时注意body的设置,如下图所示
全栈程序员站长
2022/08/24
1.7K0
Unity–Cinemachine官方实例详解
sc命令解析与实例使用
Tips : 在 PowerShell 中sc 是 cmdlet Set-Content 的别名,应该这样使用加上 .exe 才能正常使用。
全栈工程师修炼指南
2022/09/28
1.4K0
sc命令解析与实例使用
sc命令解析与实例使用
描述:配置服务启动方式或者禁用服务,它有三种状态AUTO/DEMAND/DISABLED; 基础案例:
全栈工程师修炼指南
2020/10/26
1.3K0
sc命令解析与实例使用
Python数字图像处理——OpenCV实例解析
cv.ADAPTIVE_THRESH_MEAN_C:该阈值是平均值的附近区域减去恒定的Ç。 cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值减去常数C的高斯加权和。
荣仔_最靓的仔
2021/02/02
1.2K0
Python数字图像处理——OpenCV实例解析
实例解析:如何开发 VSCode LSP 服务
上图应该大家经常使用的「错误诊断」 功能,它能够在你编写代码的过程中提示,那一块代码存在什么类型的问题。
Tecvan
2021/12/09
3K0
实例解析:如何开发 VSCode LSP 服务
实例解析:如何开发 VSCode LSP 服务
上图应该大家经常使用的「错误诊断」 功能,它能够在你编写代码的过程中提示,那一块代码存在什么类型的问题。
桃翁
2021/08/13
1.5K0
实例解析:如何开发 VSCode LSP 服务
java 解析 XML实例
package com.hseact.fecp.servlet; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.json.JSONObject; import org.json.XM
庞小明
2018/03/07
1.4K0
SQL SERVER实例解析
SQL SERVER实例的概念和“类与对象”的概念很相似。可以把SQL SERVER的安装程序看做是一个类,安装过程则是创建对象的过程,创建出来的对象称为“SQL SERVER实例”——即“类与对象”中把类实例化的概念。
全栈程序员站长
2022/07/15
1.5K0
FluxSink实例及解析
reactor-core-3.1.3.RELEASE-sources.jar!/reactor/core/publisher/FluxSink.java
code4it
2018/09/17
1.8K0
FluxInterval实例及解析
reactor-core-3.1.3.RELEASE-sources.jar!/reactor/core/publisher/FluxInterval.java
code4it
2018/09/17
1.2K0
java linkedlist实例_Java LinkedList集合功能实例解析
由于LinkedList底层数据结构是链表,因此有一些特有的功能从链表对应到集合中。
用户7886150
2021/04/23
5510
点击加载更多

相似问题

如何从旧实例创建新实例?

16

Unity Container已解析实例后处理

10

每次我使用实例变量时,Spring都会返回新实例

11

如何使旧的Linux进程实例在启动新实例时退出?

23

使用unity容器解析NLog实例

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文