如何在结构化地图中注册通用接口的所有实例?
我知道如何为非通用接口执行此操作:
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) 在WCF服务中哪一个引导StrucureMap?此刻完全迷失在这里......
我在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
任何人都可以帮我解决这个问题吗?谢谢!
我正在尝试使用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) 我有一个通用接口,它有两种泛型类型.我想装饰所有返回的版本,但由于我在调用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) 将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 3.0并注意到缺少ObjectFactory.Inject.这种方法提供的简单注入配置的等价物是什么?
我最近一直在使用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类上设置其他东西.
我有一个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
我的解决方案中有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专家所以我想确保我不仅仅是让生活变得更加艰难.
structuremap ×10
c# ×6
.net ×2
asp.net-mvc ×2
generics ×1
interface ×1
nancy ×1
nhibernate ×1
nuget ×1
registry ×1
wcf ×1