标签: structuremap

如何在StructureMap中注册通用接口

如何在结构化地图中注册通用接口的所有实例?

我知道如何为非通用接口执行此操作:

internal class MVCDemoRegistry : Registry
    {
        public MVCDemoRegistry()
        {
            Scan(x =>
            {
                x.Assembly("MVCDemo");
                x.Assembly("MVCDemo.Infrastructure");
                x.Assembly("MVCDemo.Services");

                x.AddAllTypesOf<ISupplyView>();
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

structuremap generics registry interface

5
推荐指数
1
解决办法
3309
查看次数

StructureMap(或任何IoC)和WCF

在WCF服务中哪一个引导StrucureMap?此刻完全迷失在这里......

c# structuremap wcf

5
推荐指数
1
解决办法
1945
查看次数

StructureMap异常:没有为PluginFamily定义默认实例

我在CoreService项目中定义了一个SysMsgManager类,如下所示:

public class SysMsgManager 
{
    private ISysMsgRepository _SysMsgRepository;

    public SysMsgManager()
    {
        _SysMsgRepository = ObjectFactory.GetInstance<ISysMsgRepository>();
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)

在我的DataAccess项目中,我有'ISysMsgRepository'接口和两个具体实现,定义如下:

namespace DataAccess.Repository
{
   [Pluggable("Default")]
   public class SysMsgRepository : ISysMsgRepository
   {
      ...
   }
}

namespace DataAccess.Repository
{
    [Pluggable("Stub")]
    public class SysMsgRepository_Test : ISysMsgRepository
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我在StructureMap.config文件中的内容

<StructureMap>

<Assembly Name="CoreService" /> 
<Assembly Name="DataAccess" />

<PluginFamily
    Assembly="DataAccess"
    Type="DataAccess.Repository.ISysMsgRepository"
    DefaultKey="Default" />

</StructureMap>
Run Code Online (Sandbox Code Playgroud)

当我尝试运行我的应用程序时,出现以下错误:

StructureMap异常代码:202 \n没有为PluginFamily定义的默认实例DataAccess.Repository.ISysMsgRepository,DataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null

任何人都可以帮我解决这个问题吗?谢谢!

structuremap

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

属性注入动作过滤器

我正在尝试使用Property Injection处理自定义操作过滤器属性.它本来应该工作,但是,我想在Property本身上使用DI.我的过滤器看起来像这样

[AttributeUsage(AttributeTargets.Class)]
public sealed class HeaderFilterAttribute : ActionFilterAttribute
{
    public IMarketService MarketService
    { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var view = (ViewResultBase)filterContext.Result;

        if (view != null)
        {
            BaseViewModel viewModel = view.ViewData.Model as BaseViewModel;
            if (viewModel != null)
                viewModel.Header = GetHeaderScript();
        }
        base.OnActionExecuted(filterContext);
    }

   private string GetHeaderScript()
   {
     //Use MarketService here and return header script
     return "script";
   }
}
Run Code Online (Sandbox Code Playgroud)

这就是我在BootStrapper类中使用StructureMap配置属性的方法.

            //HeaderFilterAttribute
        IMarketRepository marketRepository = new SqlMarketRepository();
        IMarketService marketService = new MarketService(marketRepository);
        ObjectFactory.Container.Configure(r => r.ForConcreteType<HeaderFilterAttribute>().
                                          Configure.WithProperty("MarketService").
                                          EqualTo(marketService)); …
Run Code Online (Sandbox Code Playgroud)

c# structuremap dependency-injection asp.net-mvc-2

5
推荐指数
1
解决办法
1344
查看次数

使用Structuremap装饰通用接口

我有一个通用接口,它有两种泛型类型.我想装饰所有返回的版本,但由于我在调用EnrichWith时不知道类型,它显然不能编译.我已经尝试使用在上下文中传递的EnrichWith重载,想想也许我可以获取传入的泛型类型并调用Activator.CreateInstance,但是在调试和检查它时,上下文没有任何有用的信息.

这是我到目前为止所拥有的.这是我的通用界面:

public interface IServiceOperation<in TRequest, out TResponse> where TResponse : ServiceResult, new()
{
    TResponse PerformService(TRequest validatedRequest);
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例实现:

public class SignUpService : IServiceOperation<SignUpRequest, SignUpResult>
{
    private readonly IUserRepository _userRepo;

    public SignUpService(IUserRepository userRepo)
    {
        _userRepo = userRepo;
    }

    public SignUpResult PerformService(SignUpRequest validatedRequest)
    {
        var user = Mapper.Map<User>(validatedRequest);

        user.MarkAsLoggedIn();
        user.ChangePassword(validatedRequest.UnhashedPassword);

        using(var transaction = _userRepo.BeginTransaction())
        {
            _userRepo.Save(user);
            transaction.Commit();
        }

        return new SignUpResult();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的装饰者,也接受另一项服务:

public class ValidateServiceDecorator<TRequest, TResponse> : IServiceOperation<TRequest, TResponse> where TResponse : ServiceResult, new()
{
    private readonly IServiceOperation<TRequest, TResponse> …
Run Code Online (Sandbox Code Playgroud)

.net c# structuremap

5
推荐指数
1
解决办法
1732
查看次数

扫描的目的.CallingAssembly,scan.WithDefaultConventions in StructureMap-MVC3

StructureMap-MVC3包添加到ASP.NET MVC应用程序时,将添加IoC包含Initialize方法的类(由App_Start文件夹中的某些代码调用),其中包含以下内容:

public static class IoC
{
    public static IContainer Initialize()
    {
        ObjectFactory.Initialize(x =>
            {
                x.Scan(scan =>
                    {
                        scan.TheCallingAssembly();
                        scan.WithDefaultConventions();
                    });
                // x.For<IExample>().Use<Example>();
            });
        return ObjectFactory.Container;
    }
}
Run Code Online (Sandbox Code Playgroud)

scan.TheCallingAssembly()scan.WithDefaultConventions()代码的目的是什么?我在StructureMap文档中看不到这些方法的好解释.

在非MVC项目中使用StructureMap时,我发现x.Scan可以删除整个部分而不会产生任何影响.

structuremap asp.net-mvc nuget

5
推荐指数
1
解决办法
2458
查看次数

StructureMap 3.0中ObjectFactory.Inject的等价物是什么

我最近升级到StructureMap 3.0并注意到缺少ObjectFactory.Inject.这种方法提供的简单注入配置的等价物是什么?

.net c# structuremap dependency-injection structuremap3

5
推荐指数
1
解决办法
1731
查看次数

找不到字段:'Nancy.Bootstrapper.NancyBootstrapperLocator.Bootstrapper'

我最近一直在使用Nancy fx并且我喜欢它,但当我尝试制作一个结构图ioc像文档页面建议我得到错误

找不到字段:'Nancy.Bootstrapper.NancyBootstrapperLocator.Bootstrapper'.

我已经覆盖了文件中显示的getApplicationContainer函数

https://github.com/CarlosBolanos/apadrina/blob/master/Application/Bootstrapper.cs

但仍然得到相同的错误,我看看rnancy存储库上的代码 https://github.com/NancyFx/Nancy.Bootstrappers.StructureMap/blob/master/src/Nancy.Bootstrappers.StructureMap/StructureMapNancyBootstrapper.cs 和我不能看看bootstrapper属性

任何其他人也有这个错误我一直试图设置这几个小时,如果我删除nugget中的nancystructuremap错误消失.

或者我需要在bootstrap类上设置其他东西.

structuremap nhibernate nancy

5
推荐指数
1
解决办法
1505
查看次数

使用结构图依赖注入时,"没有注册IUserTokenProvider"

我有一个MVC 5项目已被修改为使用int作为身份的主键,如本指南所示

然后我按照本指南中的说明启用了电子邮件确认

一切都按预期工作正常.然后我安装了structuremap.mvc5用于依赖注入,并添加了修改后的DefaultRegistry.cs

public DefaultRegistry() {
        Scan(
            scan => {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
                scan.AssemblyContainingType(typeof(MyProject.Data.MyDbContext));
                scan.With(new ControllerConvention());
            });
        //For<IExample>().Use<Example>();
        For<IUserStore<ApplicationUser, int>>().Use<MyUserStore>().LifecycleIs<HttpContextLifecycle>();
        For<IAuthenticationManager>().Use(() => HttpContext.Current.GetOwinContext().Authentication);

    }
Run Code Online (Sandbox Code Playgroud)

该项目构建正常但在尝试在站点上注册新用户时,发送电子邮件确认现在抛出异常System.NotSupportedException:在调用UserManager.GenerateEmailConfirmationTokenAsync(userID)时没有注册IUserTokenProvider.

private async Task<string> SendEmailConfirmationTokenAsync(int userID, string subject)
    {
        string code = await UserManager.GenerateEmailConfirmationTokenAsync(userID);
        var callbackUrl = Url.Action("ConfirmEmail", "Account",
           new { userId = userID, code = code }, protocol: Request.Url.Scheme);
        await UserManager.SendEmailAsync(userID, subject,
           "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

        return callbackUrl;
    }
Run Code Online (Sandbox Code Playgroud)

我是依赖注入的新手,很确定我做错了什么.我会感激你的想法和见解.

c# structuremap dependency-injection asp.net-mvc-5 asp.net-identity

5
推荐指数
1
解决办法
7087
查看次数

StructureMap解决跨项目的依赖关系

我的解决方案中有4个项目

  1. UI
  2. 基础设施
  3. 实体
  4. 测试

所有代码优先数据库设置和结构图设置都位于基础结构项目中.UI是ASP.NET MVC5.基础结构项目还承载一些WebService实现.

在UI项目中有一些类,它们充当控制器和外部Web服务之间的层.例如:

UI.Services.MappingService.cs 将使用方法 Infrastructure.ExternalWebServices.MappingWebService.cs

到目前为止,没有任何问题,接口名称都与具体的类名相匹配,因此structuremap可以正确解析它们.但是,现在需要从一个服务接口进行更改并实现多个具体类.

基础结构项目无法引用UI,因为它会创建循环依赖项.使用Mapping示例,我需要

UI.Services.Interfaces.IMappingService如果有不同的混凝土,structuremap将通过注册表文件中的逻辑或工厂类来解析正确的混凝土.问题是注册表文件位于基础结构项目中,因此无法识别UI,因此For(...).Use(...)无法实现.

如果我将接口移动到实体项目,它可以看到它们,但这也将涉及移动具体的类,这将破坏许多引用,并需要很多移动文件来修复.UI中的整个服务层加上相当多的视图模型需要移出实体项目才能实现.

有没有更简单的方法?我不是DI/StructureMap专家所以我想确保我不仅仅是让生活变得更加艰难.

c# structuremap asp.net-mvc dependency-injection

5
推荐指数
1
解决办法
2980
查看次数