如何获取在 IWindsorContainer 中注册的程序集列表(不是类,一个程序集中可能有多个类)?
当有人调用 URL“/index/5”时,我想返回一个视图,同时我想启动一个新线程,在该线程中我想通过一些数据库调用和业务逻辑来确定是否应该向其他人发送通知。这是我的设置的简化表示,它给出了错误。
如何让我的子作用域在并行线程中工作?
应用启动
var builder = new ContainerBuilder();
builder.RegisterType<MyRepository>().As<IMyRepository();
builder.RegisterType<Entities>().As<Entities>().InstancePerRequest();
var container = builder.Build();
Run Code Online (Sandbox Code Playgroud)
控制器
private readonly IMyRepository _myRepository ;
public MyController(
IMyRepository myRepository
)
{
_myRepository = myRepository;
}
public async Task<ActionResult> Index(int id)
{
_myRepository.DoSomething(id);
return View();
}
Run Code Online (Sandbox Code Playgroud)
存储库:
private ILifetimeScope _lifeTimeScopeChild = null;
public void DoSomething(int id){
//start new thread with child scope
using(var threadLifeTime = AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope())
{
_lifeTimeScopeChild = threadLifeTime;
Thread t = new Thread(new ParameterizedThreadStart(MySeparateThread));
t.Start(id);
}
}
private void MySeparateThread(object id) {
var …Run Code Online (Sandbox Code Playgroud) 我正在转换现有应用程序以利用多个处理器。我有一些嵌套循环,并且我已将最内层循环转换为 Parallel.Foreach 循环。在原始应用程序中,在最内层循环内,代码将调用DataTable.NewRow()实例化适当布局的新 DataRow、填充列并将填充的 DataRow 添加到带有 的 DataTable 中DataTable.Add()。但由于 DataTable 仅对于读取操作是线程安全的,因此我已转换处理以将填充的 DataRow 对象添加到对象中ConcurrentBag<DataRow>。然后,一旦 Parallel.Foreach 循环完成,我将迭代 ConcurrentBag 并将 DataRow 对象添加到 DataTable 中。它看起来像这样......
DataTable MyDataTable = new DataTable()
// Add columns to the data table
For(int OuterLoop = 1; OuterLoop < MaxValue; OuterLoop++)
{
//Do Stuff...
ConcurrentBag<DataRow> CB = new ConcurrentBag<DataRow>();
Parallel.Foreach(MyCollectionToEnumerate, x =>
{
//Do Stuff
DataRow dr = MyDataTable.NewRow();
// Populate dr...
CB.Add(dr);
{);
ForEach(DataRow d in CB)
MyDataTable.Add(d);
}
Run Code Online (Sandbox Code Playgroud)
因此,当运行时,我看到“索引超出了数组的范围”。调用时出现异常MyDataTable.NewRow()。但是 NewRow() …
我是温莎城堡的菜鸟。我正在构建一个使用实体框架 6 和 Castle Windsor 的应用程序,以及一个 MSTest 单元测试类。我的应用程序中有一个实现IWindsorInstaller. 我的单元测试类如下所示:
[TestClass]
public class DatabaseTests {
static readonly WindsorContainer Container = new WindsorContainer();
public DatabaseTests() {
Container.Install( FromAssembly.This() );
}
[TestMethod]
public void FirstTest() {
// Test statements
}
[TestMethod]
public void SecondTest() {
// Test statements
}
// Other tests
}
Run Code Online (Sandbox Code Playgroud)
单元测试项目中还有一个安装程序类,如下所示:
public class TestsInstaller : IWindsorInstaller {
public void Install( IWindsorContainer container, IConfigurationStore store ) {
container.Install( new RecipeManager.RepositoriesInstaller() );
}
}
Run Code Online (Sandbox Code Playgroud)
当我转到“单元测试会话”窗口并尝试运行所有测试时,第一个测试成功,其余的我得到此堆栈跟踪:
无法创建类 UnitTests.DatabaseTests 的实例。错误:Castle.MicroKernel.ComponentRegistrationException:无法注册组件 RecipeManager.DAL.CategoryRepository。已经有一个具有该名称的组件。您想改为修改现有组件吗?如果没有,请确保在 Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler …
尽管 PerRequestLifetimeManager 生命周期管理器工作正常,并且可以帮助处理HTTP 请求范围内的有状态或线程不安全的依赖项,但在可以避免的情况下使用它通常不是一个好主意,因为它通常会导致错误实践或在使用不当时难以在最终用户的应用程序代码中发现错误。建议您注册的依赖项是无状态的,如果需要在 HTTP 请求的生命周期内在多个对象之间共享公共状态,那么您可以拥有一个无状态服务,该服务使用 Items 集合显式存储和检索此状态当前对象。
警告指的是哪种错误或不良做法?一个人会如何错误地使用它?- 不幸的是,警告不是很具体,因此很难应用于现实世界。此外,我不清楚在这种情况下有状态意味着什么。
恕我直言,使用 PerRequestLifetimeManager 的典型场景是某种数据库连接(例如 DbContext)或类似的。
我目前正在开发一个使用相当数量枚举的C#程序.它的组织方式使得一个类包含许多枚举,并且这些类中有几个.但是,两个枚举在两者之间是相同的 - 出于组织目的,拥有一种'SharedEnums'类会很好,然后执行以下操作:
public class FirstEnumCollection {
public enum Fruits = SharedEnums.Fruits;
//insert non-shared enums here
}
public class FirstEnumCollection {
public enum Fruits = SharedEnums.Fruits;
//insert non-shared enums here
}
public class SharedEnums {
public enum Fruits {
Apple,
Pear
}
}
Run Code Online (Sandbox Code Playgroud)
这样,我们将不会在类之间多次声明相同的枚举,并且更改共享枚举将更改两个类中的枚举.我已经尝试了几个没有运气的例子,而且我很确定它无法完成,但是想要确认.
我们使用Autofac在我们的Web应用程序中执行一些简单的依赖注入.它都是在幕后操作的类中配置和注册的.它使得我们项目中的注入东西很容易,就像这样:
//interface
public interface ISuperHereService
{ }
//class that uses the interface
public class SuperHeroFactory
{
public ISuperHeroService SuperHeroService { get; }
public SuperHeroFactory(ISuperHeroService superHeroService)
{
SuperHeroService = superHeroService;
...do all our stuff...
Run Code Online (Sandbox Code Playgroud)
但是现在我不得不创建一个单独的项目作为控制台应用程序.我的控制台应用程序有一个Main方法.
我完全不确定如何在Main方法中注入接口.
这可能吗?
谢谢!
c# ×7
.net ×5
autofac ×2
asp.net ×1
asp.net-mvc ×1
class ×1
datatable ×1
enums ×1
reflection ×1
unit-testing ×1