采取以下无用的计划:
class Program
{
static void Main(string[] args)
{
IUnityContainer unityContainer = new UnityContainer();
IWindsorContainer windsorContainer = new WindsorContainer();
Program unityProgram = unityContainer.Resolve<Program>();
Program castleProgram = windsorContainer.Resolve<Program>();
}
}
Run Code Online (Sandbox Code Playgroud)
UnityContainer将返回一个Program实例,其中Windsor容器将抛出ComponentNotFoundException.
我可以看到这两种行为的争论,并且不介意我最终会遇到什么,但是Prism V2 Drop 8(写作时最新的)依赖于内部的Unity行为,请求尚未注册的类.
而不是为Prism找到并注册所有这些类,我宁愿让Windsor表现得像Unity一样.我没有在谷歌找到任何帮助我这样做的东西(虽然我的术语可能是错的)和Windsor文档相当糟糕...
任何人都可以建议解决这个问题吗?
看过NInject如何做到这一点,AutoFac可以做到这一点我试图弄清楚如何使用Castle Windsor将依赖注入MVC ActionFilters
目前我正在使用一个丑陋的静态IoC助手类来解析构造函数代码中的依赖关系,如下所示:
public class MyFilterAttribute : ActionFilterAttribute
{
private readonly IUserRepository _userRepository;
public MyFilterAttribute() : this(IoC.Resolve<IUserRepository>()) { }
public MyFilterAttribute(IUserRepository userRepository)
{
_userRepository = userRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
我想从我的过滤器中删除静态反模式IoC的东西.
任何暗示我将如何与温莎城堡一起做这件事?
不,改变DI框架不是一种选择.
在我的ASP.Net MVC应用程序中,我实现了一个Custom ActionFilter来授权用户.
我使用CastleWindsor为所有控制器提供依赖注入,如下所示:
protected virtual IWindsorContainer InitializeServiceLocator()
{
IWindsorContainer container = new WindsorContainer();
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));
container.RegisterControllers(typeof(HomeController).Assembly);
ComponentRegistrar.AddComponentsTo(container);
ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container));
return container;
}
Run Code Online (Sandbox Code Playgroud)
在我的CustomAttribute中,我需要一个由我的所有控制器使用的依赖项,但是我无法在属性中使用基于构造函数的注入.
那么这里最干净的方法是什么?我该如何提供依赖?
c# asp.net-mvc dependency-injection castle-windsor action-filter
我们有很多验证方法需要访问存储库/数据库才能完成工作.到目前为止,我们一直在使用服务定位器模式(尽管很少)在自定义ValidationAttributes中完成此操作:
public override bool IsValid(object value)
{
// use custom service locator in our app's infrastructure
var repos = DependencyInjector.Current.GetService<IXyzRepository>();
...
}
Run Code Online (Sandbox Code Playgroud)
我知道这是:(作为一个反模式,我们想使用更正确的方法.我们使用统一,我读了这篇文章,说使用建立方法.但是接受的答案中的链接说文档已经过时(退役内容).
解决方案不需要使用验证属性,我想它可以使用IValidatableObject,但问题仍然存在:如何将依赖项注入模型.我们需要一个自定义模型绑定器吗?
另一种解决方案是在控制器中执行验证,其中依赖注入很容易.对我来说,这感觉很混乱.我希望模型在到达action方法时得到验证.
此外,我们有时使用[RemoteAttribute]在客户端上执行某些验证.目前,这些方法通过使用静态Validator.TryValidateObject方法构造视图模型并将验证委托给模型.
如何在不使用SL反模式的情况下完成需要注入依赖项才能完成工作的验证?
2012年12月18日更新
由于这个问题似乎得到了不少观点,我应该指出,接受的答案不是我使用的解决方案,但它确实提供了构建解决方案的链接和资源,但在我看来,并非理想的解决方案.我的回答包含 MVC框架标准部分的替换 ; 并且你应该只使用那些,如果你觉得它们仍然适用于未来的版本(一些私有代码被从官方资源中删除,因为基类中没有足够的可扩展性).
但是,我可以确认这两个类也适用于Asp.Net MVC 4以及3.
我也可以重复Asp.Net Web API框架的类似实现,这是我最近所做的.
结束更新
我有一个类型,有很多'标准'验证(需要等),但也有一些自定义验证.
一些此验证需要抓住服务对象并使用其他属性之一作为关键字查找某些较低级别(即"模型层"下方)元数据.然后,元数据控制是否需要一个或多个属性以及这些属性的有效格式.
更具体一点 - 类型是卡片支付对象,简化为两个有问题的属性,如下所示:
public class CardDetails
{
public string CardTypeID { get; set; }
public string CardNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个服务:
public interface ICardTypeService
{
ICardType GetCardType(string cardTypeID);
}
Run Code Online (Sandbox Code Playgroud)
ICardType 然后包含不同的信息 - 这里的两个至关重要:
public interface ICardType
{
//different cards support one or more card lengths
IEnumerable<int> CardNumberLengths { get; set; }
//e.g. - implementation of the Luhn algorithm
Func<string, bool> CardNumberVerifier { get; …Run Code Online (Sandbox Code Playgroud) 一些依赖注入容器使您能够将已配置的服务注入已构造的对象.
使用Windsor可以实现这一点,同时考虑到目标对象上可能存在的任何服务依赖性吗?