我有一个使用SimpleInjector和MVC的站点,并且试图确定在体系结构上哪里出了问题。
我正在设置我的DI容器:
public static class DependencyConfig
{
private static Container Container { get; set; }
public static void RegisterDependencies(HttpConfiguration configuration)
{
*snip*
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, Container);
}
}
我的RegisterGlobalFilters看起来像这样:
public static class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container)
{
filters.Add(new HandleErrorAttribute());
filters.Add(container.GetInstance<OrderItemCountActionFilterAttribute>());
if (container.GetInstance<ISiteConfiguration>().ConfiguredForExternalOrders)
{
filters.Add(container.GetInstance<StoreGeolocationActionFilterAttribute>());
}
filters.Add(container.GetInstance<StoreNameActionFilterAttribute>());
}
}
商店可以在商店的售货亭或在家中通过网上订购订单。外部订单将需要进行地理位置定位,以向客户显示有关其最近商店的信息。但这意味着我必须将该容器用作全局过滤器中的服务定位器,这意味着我必须在DI容器中隐藏对全局过滤器的调用。在我看来,所有这些都像是一种反模式,或者应该有一种更好的方法来做到这一点。
在与系统架构师进行了一些讨论之后,我们得出了一个(令人尴尬的简单结论),即对我们的体系结构的最佳答案是在我们的DI容器中创建两个Register函数-一个称为RegisterCorporateWebSiteDependencies()和另一个RegisterStoreWebsiteDependencies()。
它的自然扩展是在依赖项组合之后还具有2个全局过滤器配置,(再次)对于RegisterCorporateGlobalFilters()一个,对于RegisterStoreGlobalFilters()一个。
这将导致一个整体if语句运行寄存器ex:
if (Convert.ToBoolean(ConfigurationManager.AppSettings["IsCorporate"]))
{
DependencyConfig.RegisterCorporateWebSiteDependencies(GlobalConfiguration.Configuration);
}
else
{
DependencyConfig.RegisterStoreWebSiteDependencies(GlobalConfiguration.Configuration);
}
这更加直接,并且从其他可能会引起混淆的位置删除了逻辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句