标签: structuremap

使用依赖注入组织ASP.Net MVC解决方案的最佳方法是什么?

我在一个新的ASP.Net MVC项目的早期开发,我使用这个项目进入DI.我很确定我会选择结构图,但这不是我要问的问题.我想弄清楚的是如何最好地组织我的解决方案.单元测试项目和模型都可以获取配置文件来映射它们的依赖关系,还是有一个类来统治它们?

另外,在我走得太远之前,还有什么新手陷阱可以避免吗?

非常感谢,所有.....

更新 我应该补充一点,当我说"组织解决方案"时,我并不是指文件/文件夹的数量等,而是如何构建与DI相关的类.特别是,如何管理引导程序.我可以看到我的言语不好会导致混乱.

structuremap asp.net-mvc dependency-injection inversion-of-control

14
推荐指数
2
解决办法
2221
查看次数

StructureMap和装饰器模式

我正在使用StructureMap,v.2.5.3,并且在将接口上的实现链接在一起以实现Decorator模式时遇到了麻烦.

我已经习惯了Windsor,可以在接口实现上命名变体并发送命名的impl.进入另一个(默认)impl.

这是默认的非装饰版本,工作正常:

ObjectFactory.Initialize(registry =>
{
  registry.ForRequestedType<ICommentService()
    .TheDefault.Is.OfConcreteType<CommentService>();
... }
Run Code Online (Sandbox Code Playgroud)

这是装饰器上的ctor,我想调用:

public CommentAuditService( ICommentService commentService, 
                            IAuditService auditService )
Run Code Online (Sandbox Code Playgroud)

这有效,但不允许我访问装饰对象:

registry.ForRequestedType<ICommentService>()
  .TheDefault.Is.OfConcreteType<CommentService>()
  .EnrichWith(x => new CommentAuditService());
Run Code Online (Sandbox Code Playgroud)

这需要我一个inf.环:

registry.ForRequestedType<ICommentService>()
  .TheDefault.Is.OfConcreteType<CommentService>()
  .EnrichWith(x => new CommentAuditService( new CommentService(), 
                                            new AuditService()));
Run Code Online (Sandbox Code Playgroud)

到目前为止,这似乎是我应该工作的:

registry.ForRequestedType<ICommentService.()
  .TheDefault.Is.OfConcreteType<CommentAuditService>()
  .WithCtorArg("commentService")
  .EqualTo(new CommentService());
Run Code Online (Sandbox Code Playgroud)

然而,它将它发送到创建CommentAuditService的新实例的无限循环中

有人有快速回答吗?(除了切换到Castle.Windsor,我现在非常接近)

structuremap

14
推荐指数
1
解决办法
1849
查看次数

StructureMap无法识别TheCallingAssembly

我是IOC和StructureMap的新手.当我试图调用TheCallingAssembly()方法时,它无法识别它.

有人请帮忙

ObjectFactory.Configure(x => 
            {
                x.Scan(y =>
                {
                   // y.TheCallingAssembly();
                    y.LookForRegistries();
                });
            });
Run Code Online (Sandbox Code Playgroud)

.net c# structuremap inversion-of-control

14
推荐指数
1
解决办法
3106
查看次数

如何配置Web API 2和结构图

我已经浏览了多个博客等,试图找出如何使用Web API 2配置StructureMap,但没有一个实现对我有用.混淆似乎是围绕MVC使用的不同IDependency Resolver和Web API使用的IDependency Resolver.

首先,哪个是正确的Nuget包,其次,如何使用纯Web API 2项目进行配置?

谢谢

这就是我到目前为止所做的工作.它是否正确?

 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)

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

14
推荐指数
2
解决办法
2万
查看次数

在运行时将命令的不同实现注入命令

我的项目中有一个接口,有2个类实现它:

public interface IService
{
   int DoWork();
}

public class Service1:IService
{
    public int DoWork()
    {
       return 1;
    }
}  

public class Service2:IService
{
    public int DoWork()
    {
       return 2;
    }
}    
Run Code Online (Sandbox Code Playgroud)

我有一个依赖于它的命令处理程序IService:

public CommandHandler1:ICommandHandler<CommandParameter1>
{
     IService _service;  
     public CommandHandler1(IService service)
     {
          _service = service
     }  
     public void Handle()
     { 
          //do something
          _service.DoWork();
          //do something else 
     }
}

public interface ICommandHandler<TCommandParameter> 
                 where TCommandParameter :ICommandParameter
{
    void Handle(TCommandParameter parameter);
}
public interface ICommandParameter
{
}
Run Code Online (Sandbox Code Playgroud)

我想基于用户选择注入Service1Service2 …

c# structuremap dependency-injection multiple-instances

13
推荐指数
1
解决办法
1634
查看次数

如何将参数传递给IOC框架中的构造函数

如何将参数传递给IOC框架中的构造函数?我想做类似的事情:(试图成为IOC框架不可知;))

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}
Run Code Online (Sandbox Code Playgroud)

看起来这在StructureMap中是不可能的.但我很乐意看到有人证明我错了.

其他框架是否功能更丰富?或者我是以错误的方式使用IOC框架?

language-agnostic structuremap inversion-of-control

12
推荐指数
2
解决办法
4884
查看次数

结构图,带有插件列表的构造函数

我有这样的界面

public interface IWriter
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

和一个班级

public class WriterMerger
{
  public WriterMerger(IEnumerable<IWriter> writers)
  ...
}
Run Code Online (Sandbox Code Playgroud)

我希望structuremap用WriterMerger填充所有已注册的IWriter的构造函数参数.我注册了不同的作家

StructureMap.ObjectFactory.Initialize(x =>
{
  x.ForRequestedType<IWriter>().AddConcreteType<MemoryWriter>();
  x.ForRequestedType<IWriter>().AddConcreteType<FlatFileWriter>();
  x.ForRequestedType<IWriter>().AddConcreteType<DbWriter>();
}
Run Code Online (Sandbox Code Playgroud)

但是打电话

ObjectFactory.CreateInstance<WriterMerger>();
Run Code Online (Sandbox Code Playgroud)

返回异常"没有为PluginFamily System.Collections.Generic.IEnumerable`1 [[IWriter ..]]"定义的默认实例(已编辑类名)

自动执行此操作的任何技巧?或者我是否必须制作自定义工厂方法?

.net c# structuremap

12
推荐指数
2
解决办法
3127
查看次数

使用StructureMap(完全信任)的NLog GetCurrentClassLogger()NullReferenceException

看起来NLog不能使用反射GetCurrentClassLogger(),即使我的MVC 3应用程序部署在IIS7上的完全信任环境中.我正在使用StructureMap 2.6.1,并且问题似乎在部署之间偶尔出现.我无法弄清楚为什么,虽然我认为StructureMap没有引起它.

Bootstrapper 类:

public static class Bootstrapper
{
    public static void ConfigureStructureMap()
    {
        ObjectFactory.Initialize(Init);
    }

    private static void Init(IInitializationExpression x)
    {
        x.AddRegistry(new DBServiceRegistry());
        x.AddRegistry(new MyRegistry());
    }
}
Run Code Online (Sandbox Code Playgroud)

Registry 类:

public class MyRegistry : Registry
{
    public MyRegistry()//HttpContext context)
    {
        For<ILogger>().Use<NLogLogger>();
        For<IUserRepository>().Use<SqlUserRepository>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的机器上的一切都很棒.System.NullReferenceException: Object reference not set to an instance of an object部署时为什么会出现错误?

[NullReferenceException: Object reference not set to an instance of an object.]
   NLog.LogManager.GetCurrentClassLogger() +84
   lambda_method(Closure , IArguments ) …
Run Code Online (Sandbox Code Playgroud)

structuremap nlog full-trust nullreferenceexception asp.net-mvc-3

12
推荐指数
1
解决办法
6271
查看次数

WebActivator.PreApplicationStartMethod不起作用

[assembly:  WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.StructureMapMvc), "Start")]

namespace MyApp.App_Start
{
    public static class StructureMapMvc
    {
        public static void Start()
        {
            var container = IoC.Initialize();
            DependencyResolver.SetResolver(new SmDependencyResolver(container));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码应该在global.asax中的Application_start之前运行.我正在将我的web项目从mvc 3升级到mvc 4.所以,在那个过程中,我在命名空间中犯了一个错误.这在我更正我的命名空间之前有效.它现在不再有用了.我重置了iis/flushed dns/rebuilt solution /删除了C:\ Windows\Microsoft.NET\Framework64\versionxxxxxx ...\Temporary ASP.NET Files\root中的临时.net文件.没有任何效果.我错过了什么吗?Initialize()方法具有我的所有结构映射东西依赖解析的东西.所以,如果不把它搞清楚,我就无法前进.试图诊断问题这么多个小时,我需要帮助.

c# structuremap asp.net-mvc-4

12
推荐指数
1
解决办法
1万
查看次数

structuremap - 同一接口的两个实现

我有一个服务类与以下ctor:

public class (IMessageService emailService, IMessageService smsService)
{ ... }
Run Code Online (Sandbox Code Playgroud)

IMessageService(电子邮件和短信)的两个实现.如何配置容器以正确解析此构造函数?这是命名实例进入的地方,还是另一种情况?

c# structuremap dependency-injection inversion-of-control

12
推荐指数
1
解决办法
6737
查看次数