- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有几个循环,每个循环都通过 ConcurrentQueue<T>
生成异步进程。 .这些流程调用一些使用存储库进行数据库交互的业务服务实现。服务实现全部通过 StructureMap 连接起来。
存储库实现具有一些需要仔细管理的特征:
PooledRedisClientManager
)。考虑到上述情况,我想将单个存储库实例的范围限定为每个异步进程的生命周期。
要记住的一件事是,在异步进程范围内使用的服务也被系统的其他部分使用,这些部分具有不同的生命周期特征(例如,在一个网站中,存储库的范围是生命周期页面请求)。
我将尝试用一些代码(从我的代码中简化)来说明:
管理队列的程序(以及连接执行 IAsyncResult
调用的事件处理程序):
public class Program
{
private readonly ConcurrentQueue<QueueItem> queue = new ConcurrentQueue<QueueItem>();
private readonly IItemManager itemManager; // implemented via constructor DI.
public void ProcessQueueItems()
{
while ( queue.Count > 0 || shouldContinueEnqueuing )
{
QueueItem item;
if ( queue.TryDequeue( out item ) )
{
// Begin async process here - only one repository should be used within the scope of this invocation
// (i.e. withing the scope of the itemManager.ProcessItem( item ) method call.
new ItemProcessor( itemMananger.ProcessItem ).BeginInvoke( e.Item, ItemCallback, null );
}
Thread.Sleep( 1 );
}
}
private static void ItemCallback( IAsyncResult result )
{
var asyncResult = ( AsyncResult ) result;
var caller = ( ItemProcessor ) asyncResult.AsyncDelegate;
var outcome = caller.EndInvoke( result );
// Do something with outcome...
}
private delegate ItemResult ItemProcessor( QueueItem item );
}
异步结果调用的实现。我想管理 ProcessItem( ... )
范围内的范围方法:
public class ItemManager : IItemManager
{
private readonly IServiceA serviceA; // implemented via constructor DI.
private readonly IServiceB serviceB; // implemented via constructor DI.
public ItemResult ProcessItem( QueueItem item )
{
// Both serviceA and serviceB use the repository which is injected via StructureMap. They should share
// the instance and at the end of the process it should be disposed (manually, if needs be).
var something = serviceA.DoSomething( item );
return serviceB.GetResult( something );
}
}
我认为这可以解释情况和目标。我的问题如下:
最佳答案
你可以使用 nested container对于这种情况。
The nested container will track all of the transient objects that it creates. When the nested container itself is disposed, it will call Dispose() on any of the transient objects that it created.
var nestedContainer = container.GetNestedContainer();
var processor = nestedContainer.GetInstance<IItemProcessor>();
确保每个对象都使用相同存储库的其他方法是使用 With() 方法
// Get the IRepository which should be shared
// This object is registered using simple
// For<ISession>.Use<Session> registration so not scoped
// http context or anything like that
var session = container.GetInstance<ISession>();
// Create instance of IProcessor using the specific instance
// of ISession. If multiple classes in the object grap use ISession
// they will get the same instance. Note that you can use multiple
// With() statements
var itemProcessor = container.With(session).GetInstance<IItemProcessor>();
关于c# - StructureMap:特定上下文中的自定义生命周期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9584099/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!