Tag: castle windsor

如何告诉Web API / Castle Windsor路由引擎在我的存储库中使用不同的数据库实例?

我使用模型,存储库和控制器的ASP.NET Web API Castle Windsorized应用程序了解事件流程: 0)客户端通过URI调用REST方法,例如: http://localhost:28642/api/platypi/Count 1)Castle Windsor的路由引擎映射拦截来电,发送实现接口platypiController的注册具体类在其构造函数中作为arg。 2)该构造函数确定要调用哪个方法(在这种情况下对应于“Count”)。 3)Controller方法调用Repository上的相应方法。 4)代码运行,数据收集和返回,用户认为这一切都很容易(一个极端观点)或神奇(另一个,稍微不那么极端,观点)。 我已经创建了一对利用它的项目,到目前为止它只是花花公子。 我们为不同的用户提供了几个数据库实例(特定客户端的DB1,另一个客户的DB2等)。这些表几乎但不完全相同(不保证保持不变),并且针对这些表的查询类似。 我的难题/挑战是如何或在何处拦截路由以这种方式或基于用户正在调用的“类”。 我想我需要N个存储库来实现每个接口,例如: interface FooBar class PhooBar : FooBar // targets DB#1 class PhooeyBar : FooBar // targets DB#2 class PoohBear : FooBar // targets DB#3 但是,我如何告诉Castle Windsor或Web API我想要的具体类/存储库? 在任何给定时间,都会有来自需要为DB#1数据提供服务的客户端的Web API / Castle Windsor应用程序,需要DB#2数据的其他客户端以及需要DB#3数据的用户的请求。 这是在URI中完成的事情,例如: http://localhost:28642/api/platypi/Count/1 (附加数字表示要使用的DB) ? 要么: http://localhost:28642/api/platypi/Count/PhooBar 要么…??? 在许多情况下,必须在一个Repository类和另一个Repository类之间进行更改的唯一事情是构造函数中的连接字符串。 […]

为什么在Log4Net中命名了logger?

我一直在研究使用Castle Windsor将Log4Net ILog注入类的方法。 在大多数例子中,我看到Castle Windsor可以提供一个提供属性注入的“辅助器”,并注入ILogger(而不是ILog)。 我只找到了一个使用构造函数注入的示例,并且未使用辅助方法(请参阅Castle Windsordependency injection:使用调用方类型作为参数 ) 在所有这些示例中,似乎Log4Net想要一个命名的记录器。 大多数示例引用Log4Net静态方法LogManager.GetLogger(此处为类名)。 这使得在不使用reflection或辅助方法的情况下定义CastleWindsor的依赖性是一个挑战(辅助方法可以与ctor注入一起使用)。 在查看Ilya Kogan的问题(上面的URL …)时,我想我不明白为什么需要,甚至想要一个命名的记录器。 我不能在任何地方使用同名的记录器吗? 例如,我不能只用硬编码的XXX名称注册记录器吗? (它似乎工作正常,最后,我只想记录 – 我不关心哪个记录器记录它…)是否存在范围问题? 是否存在内存泄漏问题? 为什么记录器不能/不应该是单件? public void Install(IWindsorContainer container, IConfigurationStore store) { container.Register( Component.For().UsingFactoryMethod(() => log4net.LogManager.GetLogger(“xxx”)) ); } 更新: 经过一些研究,可以使用硬编码的命名记录器 – 例如上面示例中的XXX,但是如果记录器的配置将记录器名称输出到日志文件,并且记录器名称是动态分配给与方法相同的名称,或者class,您自动获取对日志来源的引用。 日志文件中的上下文可能非常有用。 当专门针对ctor注射时,似乎有5种可能的选择…… 使用单例而不使用命名记录器(因此不会在日志文件中报告) 使用ctor注射reflection(如Ilya Kogan的例子中所示) 使用财产注入(通过协调人) 使用后尖锐的AOP IL Injection进行记录 使用CTOR注射(通过促进者)

Castle Windsor不会在物业中注入Logger!

我尝试在我的服务类的ILogger属性中注入log4net但该属性始终为NULL! 我已经看过这个话题,但它对我没有帮助! 我如何让Castle Windsor自动注入房产? 这是Program.cs CastleContainer.Instance .Install( new RepositoriesInstaller(), new PersistenceInstaller(), new LoggerInstaller(), new FormInstaller(), new ServiceInstaller() ); FrmStart form1 = CastleContainer.Resolve(new {Id=”666″ }); 我使用log4net.config外部文件,这是我的安装程序: public class LoggerInstaller : IWindsorInstaller { #region IWindsorInstaller Members public void Install(IWindsorContainer container, IConfigurationStore store) { container.AddFacility(“logging”, new LoggingFacility(LoggerImplementation.Log4net, “log4net.config”)); } #endregion } 这个类包含我想要Windsor注入的属性: public partial class FrmStart : Form […]

应用AOP

我一直在使用一些基本的AOP风格解决方案来解决安全性,日志记录,validation等交叉问题。我的解决方案涉及Castle Windsor和DynamicProxy。 我走了这条路,因为我可以使用基于Boo的DSL来应用所有内容,并保持我的代码清除属性。 周末我被告知要看看PostSharp,因为它应该是一个“更好”的解决方案。 我已经快速浏览了PostSharp,但是我被属性使用所拖延了。 有没有人尝试过两种解决方案并愿意分享他们的经验?

Castle Windsor – 如何映射构造函数注入中的命名实例

也许这很容易,但在互联网上搜索已经让我头疼 这是问题所在: interface IValidator { void Validate(object obj); } public class ValidatorA : IValidator { public void Validate(object obj) { } } public class ValidatorB : IValidator { public void Validate(object obj) { } } interface IClassA { } interface IClassB { } public class MyBaseClass { protected IValidator validator; public void Validate() { validator.Validate(this); […]

温莎城堡奇怪的行为与财产注入和工厂方法

我在ASP.NET MVC项目中使用Castle Windsor 2.5.1并使用属性注入来创建一个我期望在基本控制器类上始终可用的对象。 我正在使用工厂来创建这个对象,但是如果构造函数中有错误,我根本不会收到来自Windsor的警告,它只返回我的对象​​但没有注入属性。 这是预期的行为,如果是这样,当工厂无法返回任何内容时,如何引发错误? 这是一个例子 public class MyDependency : IMyDependency { public MyDependency(bool error) { if (error) throw new Exception(“I error on creation”); } } public interface IMyDependency { } public class MyConsumer { public IMyDependency MyDependency { get; set; } } [TestFixture] public class ProgramTest { [Test] public void CreateWithoutError() //Works as […]

你为什么要使用Windsor AsFactory?

为什么要使用Castle Windsor工厂自动实现function:AsFactory()而不是要求所需的接口? 例: container.Register(Component.For().ImplementedBy()); container.Register(Component.For().AsFactory().LifeStyle.Transient); … using (var factory = context.GetServiceFactory()) { var emailSender = factory.CreateEmailSender(); emailSender.Send(message); } 你为什么不写简单: var emailSender = context.GetServiceFactory(); emailSender.Send(message); 效果是一样的。 Windsor会将IEmailSender解析为默认的注册实现,那么重点是什么呢?

Castle Windsor:从一个程序集中自动注册类型,从而实现另一个程序集的接口

我使用Castle Windsor作为我的IoC容器 。 我有一个具有类似于以下结构的应用程序: MyApp.Services.dll IEmployeeService IContractHoursService … MyApp.ServicesImpl.dll EmployeeService : MyApp.Services.IEmployeeService ContractHoursService : MyApp.Services.IContractHoursService … 我目前使用XML配置 ,每次添加新的IService / Service对时,我都必须在XML配置文件中添加一个新组件。 我想将所有这些切换到流畅的注册API,但还没有找到正确的配方来做我想要的。 有人可以帮忙吗? 生活方式都是singleton 。 提前谢谢了。

根据情况将log4net登录到不同的appender

我正在使用log4net并且在一个类中需要记录到RollingFile appender,但是在另一个类中,我希望记录到事件日志+滚动文件+控制台appender。 什么是最佳做法? 我能看到一些示例代码吗? 为了使事情变得更加困难,我使用Castle Windsor Logging Facility和Log4net来解析我的Logger实例。 如果它有帮助,我在想下面的内容,但不知道这是否是最佳实践,或者如何基于’name’激活特定的记录器,仍然使用来自windsor的当前记录器实例: log4net.config: … … 城堡windsor容器建造者类: container.AddFacility(“logging.facility”, new LoggingFacility(LoggerImplementation.Log4net, “log4net.config”)); 要记录的类: private ILogger Logger; public Test(ILogger logger) { Logger.Info(“Can I log under event log only?”); Logger.Info(“Now can I log under both?”); } 多谢你们。

如何使用Unity 2.0注入Log4Net ILog实现

最终这与设置log4Net有关,但一般来说问题不是特定于日志记录。 一般来说,我想弄清楚的是,在Microsoft Unity 2.0中,如何做到与Castle.Facilities.Logging.LoggingFacility相同的东西。 即能够声明对记录器的依赖性,并使用注入它的对象的类型初始化记录器。 本着考验的精神值得千言万语,这就是我所需要的: class Logger_IOC_Tests { //[Test] public void Logger_should_be_initialized_with_the_type_of_the_object_that_is_using_it() { var container = new UnityContainer(); /* Configuration Magic probably involiving registering either * a custom IDependencyResolverPolicy or BuilderStrategy * goes here… */ container.RegisterType(new ContainerControlledLifetimeManager()); var user = container.Resolve(); Assert.True(user.Logger.GetUserType() == user.GetType()); } } interface ILogger { Type GetUserType(); } class Logger […]