Tag: castle windsor

城堡IOC – 解决循环引用

我的MVP实施的快速问题: 目前我有以下代码,其中演示者和视图都通过容器解析。 然后,演示者调用View.Init将自己传递给视图。 我想知道是否有办法让容器修复我的循环引用(视图 – >演示者,演示者 – >视图)。 class Presenter : IPresenter { private View _view; public Presenter(IView view, …){ _view = view; _view.Init(this) } } class View : IView { private IPresenter _presenter; public void Init(IPresenter presenter){ _presenter = presenter; } } 亲切的问候 弗雷德里克

删除了C#和IoC传递依赖项

我有一个解决方案,我使用IoC(windsor)。 解决方案中的项目如下: 接口 – 保存我将使用的所有接口契约。 IoC.Installers – 保存我的依赖项的所有安装程序(引用了impl。和接口) IoC – 保存包含IoC容器的单例类。 该类执行容器的初始化过程。 控制台 – 使用IoC解决依赖关系的项目(参考IoC接口) 问题:因为IoC项目没有直接使用IoC.Installers项目,所以在Console项目的构建过程中省略了它,因此在初始化过程中没有找到安装程序。 解决方法:在IoC项目中,我添加了一个静态构造函数,它直接从IoC.Installers项目启动安装程序并使用它(我在我做的实例上执行GetType()) 解决方法的问题:我想创建一些通用的容器持有者,我可以从解决方案转移到解决方案,而无需修复我的hack。 是否有更好的方法强制IoC.Installers DLL被复制到bin文件夹而不进行黑客攻击? 最终目标是创建一个包裹castlewindsor的nuget,并尝试找到解决方案中的所有安装程序并安装它们 我正在添加一个git仓库链接 ,我在其中创建了一个可以重现问题的项目(它还包含了解决方法) 谢谢!

使用Castle Windsor解决具有generics类型约束的接口

给定FooRequest和FooResponse是抽象的接口: public interface IFooHandler where TRequest : FooRequest where TResponse : FooResponse { TResponse CheckFoo(TRequest request); } 实施: public class MyFooHandler : IFooHandler { public MyFooResponse CheckFoo(MyFooRequest request) { /* check for foos */ } } 我如何在温莎城堡注册这个,以便我可以解决它(其中IoCContainer是一个WindsorContainer: Global.IoCContainer.Resolve<IFooHandler>(); 解决MyFooHandler的实例?

在Castle Windsor的其他课程之间共享课程实例

我试图找出在依赖它的两个其他类之间共享类的实例的最佳方法。 说我有这些课程: class A { public A(B b, C c) {} } class B { public B(IDFactory factory) {} } class C { public C(IDFactory factory) {} } interface IDFactory { D GetD(); } class D {} 对于A每个实例,我希望c和d使用的D是D的单个实例。 当我创建A的新实例(比如使用工厂)时,我希望c和d共享一个新的D实例。 到目前为止,我已经认为使用使用上下文的自定义生活方式(使用这个很酷的库)可能是最好的方法。 所以我会做这样的事情: WindsorContainer container = new WindsorContainer(); [.. standard container registration stuff ..] container.Register(Component.For().LifeStyle.Custom()); IAFactory factory […]

如何使用Castle Windsor将对象注入到WCF IErrorHandler实现中?

我正在使用WCF开发一组服务。 该应用程序正在使用Castle Windsor进行dependency injection。 我添加了一个通过属性添加到服务的IErrorHandler实现。 到目前为止一切都在发挥作用。 IErrorHandler对象(名为FaultHandler的类)正在被正确应用并被调用。 现在我正在添加日志记录。 Castle Windsor设置为注入记录器对象( IOurLogger一个实例)。 这很有效。 但是当我尝试将它添加到FaultHandler我的记录器为空。 FaultHandler的代码如下所示: class FaultHandler : IErrorHandler { public IOurLogger logger { get; set; } public bool HandleError(Exception error) { logger.Write(“Exception type {0}. Message: {1}”, error.GetType(), error.Message); // Let WCF handle things its way. We only want to log. return false; } public void […]

使用Castle Windsor IoC容器在组件注册期间设置Name属性

在我的应用程序中,我有一个名为Message的类。 Message类中存在一个名为MessageType的字符串类型的属性。 MessageType属性用于警告应用程序,以确定Message类实例中将存在哪些数据模式。 Message类派生自名为IMessage的接口。 作为一个例子,假设我们有一个Message类的实例,其MessageType属性的值为“com.business.product.RegisterUser”。 每个MessageType模式都有一个相应的消息处理程序类(MessageHandler),它派生自IMessageHandler接口。 在上面的例子中,会有一个名为RegisterUserMessageHandler的类。 所有消息处理程序类都派生自IMessageHandler。 IMessageHandler定义了一个GetMessageType函数,该函数将返回派生消息实例的MessageType属性。 在使用Castle Windsor IoC容器注册类/组件期间,我想将Name属性设置为Message实例的MessageType属性的值。 我还想使用’通过约定注册组件’方法来注册这些类/组件来完成此任务。 本练习的最终目的是允许我的代码使用Message的MessageType属性调用Resolve方法以获取正确的消息处理程序实例。 例如: string messageType = “com.business.product.RegisterUser”; IMessageHandler registerUserMessageHandler = _container.Resolve(messageType); 我很感激任何帮助来解决这个问题。 非常感谢。

Castle Windsor ASP.NET MVC 4和Web API相同的应用程序。 只有MVC控制器没有依赖关系?

本文是使用Castle Windsor进行Web API的一个很好的起点,但是如果我创建一个简单的MVC控制器呢? 它只有在注入没有依赖时才有效。 添加这个,即: public class HomeController : Controller { private readonly IValuesRepository repository; public HomeController(IValuesRepository repository) { this.repository = repository; } public ActionResult Index() { return View(); } } 导致以下错误: 为此对象定义的无参数构造函数 有没有办法在使用Castle Windsor的同一个应用程序中使用MVC和Web API逻辑? 在application_start设置DependencyResolver.SetResolver(…)之后,我没有注意到我的应用程序有任何改进。 如你看到的。 实现服务定位器: internal sealed class WindsorDependencyResolver : ServiceLocatorImplBase, IDependencyResolver { private readonly IWindsorContainer container; public WindsorDependencyResolver( IWindsorContainer container) […]

注册“半封闭”通用组件

我有两个接口: public interface IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery q); } IQueryHandler的封闭实现示例: public class EventBookingsHandler : IQueryHandler<EventBookings, IEnumerable> { private readonly DbContext _context; public EventBookingsHandler(DbContext context) { _context = context; } public IEnumerable Handle(EventBookings q) { return _context.Set() .OfEvent(q.EventId) .AsEnumerable() .Select(EventBooking.FromMemberEvent); } } 我可以使用此组件注册注册并解决IQueryHandler封闭通用实现: Classes.FromAssemblyContaining(typeof(IQueryHandler)) .BasedOn(typeof(IQueryHandler)) .WithServiceAllInterfaces() 但是,我想要做的是解决一个“半封闭”的开放式通用实现(即指定一个通用的TQuery类型参数): […]

你能在Windsor Container中注册一个类型的现有实例吗?

在Windsor IOC容器中是否可以注册一个我已经拥有实例的类型,而不是让容器创建它?

AOP缓存与温莎城堡

任何人都可以提供一个工作示例,说明如何使用Castle Windsor进行缓存。 我假设作为一个起点,我定义了从IInterceptorinheritance的CacheAspect,如下所示: public class CacheAspect : IInterceptor { public void Intercept(IInvocation invocation) { // Code here to check if data is in cache and if so // put that into invocation.ReturnValue… job done! // If not then invoke the method invocation.Proceed(); // Now cache the result of the invocation } } 然后我可以使用我的CacheAspect来装饰任何方法…… [Interceptor(typeof(CacheAspect))] public […]