- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
既然 ObjectFactory 静态函数已被标记为过时,我目前正在尝试了解结构图。
从长远来看,我必须在 MVC 和 WebApi 应用程序中使用它。以前使用时,静态方法的一行被放置在 global.asax 中,以使用 ObjectFactory 初始化所有内容。
ObjectFactory.Initialize{
container.For .....
}
尝试将其转换为新的 IContainer 方法,我提出了以下方法,但我想知道我是否实际上无意中在我的方法中实现了这种经常提到的反模式。
返回容器的静态方法:
public class StructureMapConfig
{
public static IContainer GetContainer()
{
return new Container(container =>
{
container.For<IUserService>().Use<UserService>();
container.For<IStringService>().Use<StringService>();
container.For<IUserRepository>().Use<UserRepository>();
});
}
}
Userservice 的构造函数如下所示:
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
private readonly IStringService _stringService;
public UserService(IUserRepository userRepository, IStringService stringService)
{
_userRepository = userRepository;
_stringService = stringService;
}
最后初始化(控制台应用程序中的此实例)看起来像这样:
private static IUserService _userService;
private static IContainer _container;
static void Main(string[] args)
{
_container = StructureMapConfig.GetContainer();
_userService = _container.GetInstance<IUserService>();
}
所以我的问题。
感谢您的建议。
最佳答案
按顺序回答您的问题:
- Am I doing anything seriously wrong here
不,我没有发现这里有什么严重错误。您可以进行一些改进,我将很快讨论这些改进。
- In the UserService, should I be passing the IContainer in and using the object factory to get the instance or should I leave as is.
您通过 IContainer 实例注入(inject) UserService 是正确的。如果您的 Controller 只需要 UserService 那么为什么要注入(inject)整个容器。实际上,您只想注入(inject)最少的内容,以减少不必要的耦合和依赖。
- Is returning the IContainer from the static method the best approach
在删除 ObjectFactory
后,是的,对于那些不通过 MVC 依赖解析来管理其创建的类来说,通过静态方法返回容器的实例是一种常见方法。
- If this was a MVC app, is it best practice to build this once in the Global.asax or should the controller constructor call the static method every time.
在 Global.asax.cs
中创建容器是最好的方法,因为它在 Application_Start
上完成一次,但是请参阅下面我对每个 http 使用嵌套容器的建议请求。
改进:-
利用 StructureMap 的注册表:
不要像这样直接引用依赖项:
public static IContainer GetContainer()
{
return new Container(container =>
{
container.For<IUserService>().Use<UserService>();
container.For<IStringService>().Use<StringService>();
container.For<IUserRepository>().Use<UserRepository>();
});
}
选择使用 StructureMap 的注册表。通过这种方式,您可以对依赖项进行分组(例如 MVC 特定依赖项或 WebAPI 特定依赖项,如下所示:
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserService>().Use<UserService>();
this.For<IStringService>().Use<StringService>();
this.For<IUserRepository>().Use<UserRepository>();
}
}
然后像这样加载您的注册表:
container.Configure(c => {
c.IncludeRegistry<WebsiteRegistry>();
c.IncludeRegistry<TaskRegistry>();
});
HTTP 上下文绑定(bind)容器:
将 StructureMap 与 ASP.NET MVC 或 WebApi(或任何基于 HTTP 的应用程序)结合使用时的另一个推荐模式是使用绑定(bind)到每个 HTTP 请求的嵌套容器。这基本上涉及在每个 HTTP 请求上创建一个新的嵌套容器,然后在请求结束时将其处置。这可确保 HTTP 请求结束后立即处理 session 对象、数据库连接或 UoW 上下文等依赖项。
我建议您查看 this article其中更详细地介绍了此事并讨论了如何设置。
这与 StructureMap.MVC5 中使用的技术完全相同。 StructureMap 的创建者 Jeremy Miller 经常推荐的软件包。
自动注册依赖项
您可以利用StructureMap's auto-registration,而不是手动注册StructureMap的每个依赖项。 。您还可以指定自己的扫描约定。
关于c# - 结构图 IContainer 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27575608/
我正在使用外键在 django 中进行搜索,但它显示此错误“相关字段查找无效:icontains”我在这里找到了类似的情况,但没有工作,我认为错误位于 queryset_list 行中的views
我创建了一个继承 Panel 控件的控件类。然后该控件包含另外两个面板,其中一个我想成为 IContainerControl。 我知道如何将整个控件变成 IContainerControl,但无法对子
我想在我的主页中包含一个搜索字段。它适用于某些模块领域。我的问题是当我使用 ForeignKey 字段时(如果我错了请纠正我)。 模型.py class Location(models.Model):
从应用程序的类内部获取 Autofac 容器的建议方法是什么? Autofac 是否提供解析类上的 IContainer 属性,或者我是否需要在构建容器后全局存储容器? 最佳答案 对于大多数用途,您将
我在 get_or_create 调用中使用 icontains 得到了意外结果。 举个例子: >>>team_name = "Bears" >>>Team.objects.get(name__ico
假设我有一个 WinForms 组件。 它可以是一个基于 System.ComponentModel.Component 的类或 System.Windows.Forms.Control类(实际上 C
既然 ObjectFactory 静态函数已被标记为过时,我目前正在尝试了解结构图。 从长远来看,我必须在 MVC 和 WebApi 应用程序中使用它。以前使用时,静态方法的一行被放置在 global
我得到了这些模型: @python_2_unicode_compatible class Media(models.Model): the_image = FilerImageField(nu
我正在使用 xuggler 将视频转码为不同的格式。如果我直接从文件打开我的 IContainer,它可以完美运行,但是,这次我想使用 InputStream 打开 IContainer。奇怪的是我试
我有这个问题。我的 Django 应用程序模型中有 2 个对象,有标签,并且有包含多个标签的问题,这是一种多对多关系。我正在尝试使用 Q 对象创建一个查询,如下所示: questions = ques
尝试使用ajax请求进行搜索。 prefix = str(request.POST.get('prefix')) colors = UserDataCsv.objects.filter
所以我想在给定的一些字段中找到任何类型的匹配,例如,这就是我想做的: possible_merchants = ["amazon", "web", "services"] # Possible nam
def search(request): queryset_list = Listing.objects.order_by('-list_date').filter(is_published=
我有一个这样的查询: find.where() .or(Expr.or(Expr.like("isbn", query), Expr.i
嗨,我正在尝试通过我得到的字典数据运行模型搜索查询: { "city":5, "direction":"ne", ..other data that can be dynamic..
我见过this question但它并没有回答我的问题,甚至没有很好地提出它。 我认为最好用一个例子来解释这一点: class Blah(Document): someList = ListF
我正在尝试像这样用 xuggle 打开一个视频文件: if (container.open(in, null) < 0) { throw new IllegalArgume
我正在尝试清除我的 C# 项目中的一些警告,其中有几个警告说: Warning 1 The field 'Namespace.Class.components' is assigned but its
当您在 Visual Studio 中创建新窗体时,设计器会在 .Designer.cs 文件中生成以下代码: /// /// Required designer variable. /
我正在尝试在我的管理页面中搜索“vanKit”字段。 “vanKit”是一个外键,每当我添加它时,我的 search_fields 列表都会给我这个错误“相关字段的查找无效:icontains”。
我是一名优秀的程序员,十分优秀!