标签: structuremap

使用StructureMap在模型 - 视图 - 展示器模式中进行Presenter注入

我已经实现了我自己的模型视图演示者模式的副本(在Web客户端软件工厂的静脉中),所以我可以利用我自己的DI框架而不是绑定到WCSF的ObjectBuilder,我遇到了很多问题.我想出了几个方法来做到这一点,但没有一个特别让我开心.我想知道是否有其他人有其他想法.

解决方案#1a

使用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)

解决方案#1b

在页面加载中调用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)

解决方案#1c

如果需要,通过Property访问presenter允许Getter to BuildUp.

public partial class _Default : Page, IEmployeeView
{
    private EmployeePresenter …
Run Code Online (Sandbox Code Playgroud)

c# structuremap mvp dependency-injection

6
推荐指数
1
解决办法
3319
查看次数

StructureMap拦截器

我有一堆实现各种接口的服务.例如IAlbumService,IMediaService

我想在这些接口上记录对每个方法的调用.如何使用StructureMap执行此操作?

我意识到这与这个问题几乎相同,只是因为我没有使用windsor.

structuremap dependency-injection interceptor

6
推荐指数
1
解决办法
2148
查看次数

在ASP.NET MVC中使用StructureMap注入多租户存储库

我正在多租户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是一个解决方案?

structuremap asp.net-mvc routing repository multi-tenant

6
推荐指数
1
解决办法
1912
查看次数

使用Factory获取Injected对象

使用Factory方法检索注入的对象是不错的做法,还是只使用DI框架中的工厂方法?

我正在使用结构图,我应该只使用ObjectFactory.GetInstance();还是应该创建工厂类并在此类中调用ObjectFactory.GetInstance();? 因为如果我调用ObjectFactory.GetInstance(); 在我的课程中,我将创建与DI框架的耦合?抱歉,如果我无知,我对这个概念不熟悉.谢谢!

.net c# structuremap dependency-injection

6
推荐指数
1
解决办法
265
查看次数

截取方法调用以获取附加功能的最简单方法是什么?

假设我有一个存储库,它返回一个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的新手所以请保持温柔.

structuremap aop castle-dynamicproxy mixins interceptor

6
推荐指数
1
解决办法
3251
查看次数

如何使用StructureMap将相同的接口映射到不同的ConcreteClasses?

在创建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)

c# structuremap

6
推荐指数
1
解决办法
3774
查看次数

StructureMap,使用container或objectfactory配置?

我做了这样的配置:

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中连接起来并不明显

c# structuremap

6
推荐指数
1
解决办法
8836
查看次数

如何在MVC中托管多个IoC驱动的WCF服务?

我身边有6 WCF服务,我想在一个托管MVC应用程序,将请求路由到/services/fooWcfFooService/services/barWcfBarService

我可以在服务中使用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配置不同,但我 …

c# structuremap wcf asp.net-mvc-4

6
推荐指数
1
解决办法
473
查看次数

结构图无参数构造函数错误

我正在尝试使用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)

structuremap asp.net-web-api asp.net-web-api2 structuremap3

6
推荐指数
1
解决办法
2988
查看次数

StructureMap .Net核心Windows服务嵌套容器

有很多文章讨论如何使用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

6
推荐指数
1
解决办法
649
查看次数