gpt4 book ai didi

dependency-injection - 如何在与 CaSTLe Windsor DI 容器相同的上下文中重用 transient 依赖项

转载 作者:行者123 更新时间:2023-12-04 08:23:13 27 4
gpt4 key购买 nike

如果我有以下设置,当在同一上下文中创建对象时,如何将容器配置为使用相同的数据库

public class Database { }
public interface IRepository { Database Database { get; } }
public interface IFooRepository : IRepository { }
public interface IBarRepository : IRepository { }

public class FooRepository : IFooRepository
{
public Database Database { get; private set; }
public FooRepository(Database database) { this.Database = database; }
}

public class BarRepository : IBarRepository
{
public Database Database { get; private set; }
public BarRepository(Database database) { this.Database = database; }
}

public class Consumer
{
public IFooRepository fooRepository { get; private set; }
public IBarRepository barRepository { get; private set; }
public Consumer(IFooRepository fooRepository, IBarRepository barRepository)
{
this.fooRepository = fooRepository;
this.barRepository = barRepository;
}
}

[TestClass]
public class ConfigurationTest
{
private IWindsorContainer container;

[TestMethod]
public void SameDatabaseIsUsed()
{
Consumer consumer = container.Resolve<Consumer>();
IFooRepository fooRepository = consumer.fooRepository;
IBarRepository barRepository = consumer.barRepository;
Assert.AreEqual(fooRepository.Database, barRepository.Database); //FAILS
}

[TestMethod]
public void DifferentDatabaseIsUsed()
{
Consumer consumer = container.Resolve<Consumer>();
IFooRepository fooRepository = consumer.fooRepository;
Consumer consumer2 = container.Resolve<Consumer>();
IBarRepository barRepository = consumer2.barRepository;
Assert.AreNotEqual(fooRepository.Database, barRepository.Database); //PASSES
}

[TestInitialize]
public void SetUp()
{
container = new WindsorContainer();
container.Register(
Component.For<Database>().ImplementedBy<Database>().LifeStyle.Transient,
AllTypes.FromThisAssembly()
.BasedOn<IRepository>().WithService.FromInterface()
.Configure(c => c.LifeStyle.Transient),
Component.For<Consumer>().ImplementedBy<Consumer>().LifeStyle.Transient
);

}
}

编辑:我尝试过使用自定义生活方式,但我不知道可以使用什么来检测我已切换上下文

public class DatabaseLifestyleManager : AbstractLifestyleManager
{
private CreationContext context;
private Database database;

private Database Database
{
get
{
if (database == null) database = new Database();
return database;
}
set
{
database = null;
}
}

public override object Resolve(CreationContext context)
{
if (this.context!=null && this.context.??? == context.???)
return Database;
else
{
this.context = context;
Database = null;
return Database;
}

}

public override void Dispose()
{
database = null;
context = null;
}
}
......
Component.For<Database>().ImplementedBy<Database>().LifeStyle.Custom(typeof(DatabaseLifestyleManager)

最佳答案

在请求 transient 组件时,您总是会获得一个新实例,如果这不是您想要的,请不要使用 transient 生活方式:-)

为什么要注册一个 transient 组件,但尝试根据某种“上下文”解析相同的对象?最有可能的是,这种生活方式不适合当前的情况,如果你试图强制它变成不适合的东西,你就会遇到麻烦。

您想要的是一种上下文生活方式,如 this article 中提到的。 。以下两个要点有一个实现:

这将允许您执行以下操作:

Register(Component.For<Database>().LifeStyle.Scoped())

[TestMethod]
public void SameDatabaseIsUsed()
{
using (container.BeginScope())
{
Consumer consumer = container.Resolve<Consumer>();
IFooRepository fooRepository = consumer.fooRepository;
IBarRepository barRepository = consumer.barRepository;
Assert.AreEqual(fooRepository.Database, barRepository.Database); // YAY!
}
}

希望这有帮助!

关于dependency-injection - 如何在与 CaSTLe Windsor DI 容器相同的上下文中重用 transient 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com