我已经实现了我自己的模型视图演示者模式的副本(在Web客户端软件工厂的静脉中),所以我可以利用我自己的DI框架而不是绑定到WCSF的ObjectBuilder,我遇到了很多问题.我想出了几个方法来做到这一点,但没有一个特别让我开心.我想知道是否有其他人有其他想法.
使用HttpModule拦截context.PreRequestHandlerExecute来调用ObjectFactory.BuildUp(HttpContext.Current.Handler)
public partial class _Default : Page, IEmployeeView
{
private EmployeePresenter _presenter;
private EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在页面加载中调用buildup而不是使用HttpModule
public partial class _Default : Page, IEmployeeView
{
private EmployeePresenter _presenter;
private EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
protected void Page_Load(object sender, EventArgs e)
{
ObjectFactory.BuildUp(this);
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要,通过Property访问presenter允许Getter to BuildUp.
public partial class _Default : Page, IEmployeeView
{
private EmployeePresenter …Run Code Online (Sandbox Code Playgroud) 我有一堆实现各种接口的服务.例如IAlbumService,IMediaService等
我想在这些接口上记录对每个方法的调用.如何使用StructureMap执行此操作?
我意识到这与这个问题几乎相同,只是因为我没有使用windsor.
我正在多租户ASP.NET MVC应用程序中实现StructureMap,以注入我的租户存储库的实例,这些存储库基于ITenantContext接口检索数据.该Tenant问题由下式确定RouteData在一个基本控制器的 OnActionExecuting.
如何告诉StructureMap构造TenantContext(tenantID);tenantID从我的RouteData或某个基本控制器属性派生的位置?
鉴于以下路线:
{tenant}/{controller}/{action}/{id}
Run Code Online (Sandbox Code Playgroud)
我的基本控制器Tenant根据{tenant} URL参数检索并存储正确的.使用时Tenant,ITenantContext可以构建具有an的存储库,以仅检索与该租户相关的数据.
根据其他DI问题,可能AbstractFactory是一个解决方案?
使用Factory方法检索注入的对象是不错的做法,还是只使用DI框架中的工厂方法?
我正在使用结构图,我应该只使用ObjectFactory.GetInstance();还是应该创建工厂类并在此类中调用ObjectFactory.GetInstance();? 因为如果我调用ObjectFactory.GetInstance(); 在我的课程中,我将创建与DI框架的耦合?抱歉,如果我无知,我对这个概念不熟悉.谢谢!
假设我有一个存储库,它返回一个Posts 列表.存储库接口有一个GetAll()方法可以完成它的建议.
现在按照我不应该将域逻辑放在存储库中的理论,我想拦截对具体GetAll()方法的调用,以便我可以在GetAll()结果中添加以下逻辑:
return GetAll().OrderByDescending(p => p.Posted).ToList();
Run Code Online (Sandbox Code Playgroud)
我想拦截这个的原因是因为(1)我不想让客户端记得调用扩展方法(OrderByDescending或者一些无用的包装器),我想每次调用它,(2)我不我想让我所有的具体实现都记住订购GetAll()结果 - 我想把这个逻辑放在任何存储库外部的一个地方.
最简单的方法是什么?
我已经在使用StructureMap,所以如果我可以拦截它,它可能是一个低成本选项.但我不认为SM拦截方法调用,只是创建对象实例?
我需要转到代理还是混合模式?我是否需要使用Castle Dynamic Proxy全押?或者是否有其他方法我应该考虑或者可能是一种组合?
我真的对上面我特定例子的具体建议感兴趣.我是AOP的新手所以请保持温柔.
在创建Controller1时,我希望IService将映射到ConcreteService1,将IPageService映射到ConcretePageService1
当创建Controller2时,我希望IService将映射到ConcreteService2,IPageService将映射到ConcretePageService2
我如何初始化ObjectFactory以便以上工作?
这意味着我以这种方式初始化ObjectFactory:
ObjectFactory.Initialize(x =>
{
x.For<IService>().Use<ConcreteService1>();
x.For<IPageService>().Use<ConcretePageService1>();
});
Run Code Online (Sandbox Code Playgroud)
但是,这始终映射ConcreteService1到IService和ConcretePageService1到IPageService无论控制器类型
public class Controller1 : Controller
{
public Controller1(IService service, IPageService pageService)
{
}
}
public class Controller2 : Controller
{
public Controller2(IService service, IPageService pageService)
{
}
}
public interface IService
{
}
public class ConcreteService1:IService
{
}
public class ConcreteService2:IService
{
}
public interface IPageService
{
}
public class ConcretePageService1:IPageService
{
}
public class ConcretePageService2:IPageService
{
}
Run Code Online (Sandbox Code Playgroud) 我做了这样的配置:
var container = new Container(x =>
{
x.For<IEngine>().Use<V6Engine>();
x.For<ICar>().Use<HondaCar>();
}
);
Run Code Online (Sandbox Code Playgroud)
然后在我的mvc控制器动作中我做了:
ICar car = ObjectFactory.GetInstance<ICar>();
Run Code Online (Sandbox Code Playgroud)
我应该以某种方式使用Container或ObjectFactory设置我的容器吗?它没有解决,所以我在ac#console应用程序中测试了一些东西,如果我这样做的话它会起作用:
ICar car = container.GetInstance<ICar>();
Run Code Online (Sandbox Code Playgroud)
但这仅在容器位于本地范围内时才有效,而在Web应用程序中,由于事物在global.asax.cs中连接起来并不明显
我身边有6 WCF服务,我想在一个托管MVC应用程序,将请求路由到/services/foo到WcfFooService和/services/bar到WcfBarService
我可以在服务中使用StructureMap 完成IoC,并使用Jimmy Bogard在这里写博客的示例注入我的构造函数依赖项:
Jimmy的文章很棒,但我正在尝试扩展它以使用同一MVC应用程序中托管的多个服务.从本质上讲,底部的部分是导致我一些头痛的部分:
public class StructureMapServiceHostFactory : ServiceHostFactory
{
public StructureMapServiceHostFactory()
{
ObjectFactory.Initialize(x => x.AddRegistry<FooRegistry>());
//var iTriedThisToo = ObjectFactory.Container;
//container.Configure(x => x.[etc]);
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new StructureMapServiceHost(serviceType, baseAddresses);
}
}
Run Code Online (Sandbox Code Playgroud)
使用单个 WCF服务 - 通过上面显示的StructureMapServiceHostFactory 将MVC请求路由到特定URL 的工作非常出色 - 但是 - 如果(例如)我StructureMapServiceHostFactory2为/services/bar调用创建了一个,以允许使用不同的注册表,当MVC应用程序旋转时up,它似乎依次调用每个工厂,因为它运行RouteConfig.cs并添加路由,所以最终我没有得到第一个ServiceHostFactory应该提供的配置实例.
如果我打电话Initialize();或试图抓住Container房产并打电话给它也没有什么区别Configure.
我这个隐藏到什么都没有?需要注册表隔离的主要原因是由于NHibernate配置不同,但我 …
我正在尝试使用Web API 2设置结构图ver 3.0.5.0.
我已经遵循了这个实现:使用ASP.NET Web API 2.1配置依赖注入
但是,在针对ComplexesController进行攻击时出现此错误:
尝试创建"ComplexesController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.
谁能看到我的structuremap配置有什么问题?永远不会调用Create方法.
这是我的实施:
public class StructureMapControllerActivator : IHttpControllerActivator
{
private readonly IContainer _container;
public StructureMapControllerActivator(IContainer container)
{
if (container == null) throw new ArgumentNullException("container");
_container = container;
}
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
try
{
var scopedContainer = _container.GetNestedContainer();
scopedContainer.Inject(typeof(HttpRequestMessage), request);
request.RegisterForDispose(scopedContainer);
return (IHttpController)scopedContainer.GetInstance(controllerType);
}
catch (Exception e)
{
// TODO : Logging
throw e;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个方法在我的创业公司......
public void InitializeContainer()
{
// STRUCTURE MAP …Run Code Online (Sandbox Code Playgroud) 有很多文章讨论如何使用ASP.NET Core的Structure Map,但谈论控制台应用程序或Windows服务并不是很多.ASP.Net Core中的默认行为是StructureMap为每个HTTPRequest创建一个嵌套容器,以便每个HTTP请求只对实例化一个具体类.
我正在使用PeterKottas.DotNetCore.WindowsService nuget包创建.Net核心Windows服务.我使用这篇文章设置了StructureMap:https://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/
我的Windows服务是在Timer上设置的,每X秒执行一次动作.我希望这些操作中的每一个都使用类似于ASP.NET的嵌套容器.换句话说,我希望在轮询传递完成后处理为轮询传递#1创建的所有内容.当轮询#2开始时,我想要实例化所有对象的新实例.但是,在单个轮询传递的范围内,我只希望创建每个对象的一个实例.
这样做的正确方法是什么?
这是我的程序类
public class Program
{
public static ILoggerFactory LoggerFactory;
public static IConfigurationRoot Configuration;
static void Main(string[] args)
{
var applicationBaseDirectory = AppContext.BaseDirectory;
string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (string.IsNullOrWhiteSpace(environment))
throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");
ConfigureApplication(applicationBaseDirectory, environment);
var serviceCollection = ConfigureServices();
var serviceProvider = ConfigureIoC(serviceCollection);
ConfigureLogging(serviceProvider);
var logger = LoggerFactory.CreateLogger<Program>();
logger.LogInformation("Starting Application");
ServiceRunner<IWindowsService>.Run(config =>
{
var applicationName = typeof(Program).Namespace;
config.SetName($"{applicationName}");
config.SetDisplayName($"{applicationName}");
config.SetDescription($"Service that matches Previous Buyers to Vehicles In …Run Code Online (Sandbox Code Playgroud) c# structuremap windows-services dependency-injection .net-core
structuremap ×10
c# ×6
interceptor ×2
.net ×1
.net-core ×1
aop ×1
asp.net-mvc ×1
mixins ×1
multi-tenant ×1
mvp ×1
repository ×1
routing ×1
wcf ×1