我在一个带有一些Silverlight组件的ASP.Net应用程序中使用.Net RIA Services的July CTP.我在Silverlight上打电话给RIA服务.
当我尝试在我的域服务(LinqToEntitiesDomainService对象)中使用Unity和构造函数依赖注入时出现了我的问题.Silverlight应用程序现在抱怨没有无参数构造函数.
我不想拥有无参数构造函数,我希望Unity解析构造函数参数.这可能吗?难道我做错了什么?或者我应该找到另一种方法来注入我的构造函数参数?
public class DashboardService : LinqToEntitiesDomainService<DashboardEntities>
{
private IUserService userService;
public DashboardService(IUserService userService)
: base()
{
if (userService == null)
{
throw ExceptionBuilder.ArgumentNull("userService");
}
this.userService = userService;
}
...
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Webpage error details
User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Timestamp: Tue, 18 Aug 2009 14:34:54 UTC
Message: Unhandled Error in …Run Code Online (Sandbox Code Playgroud) 是否有任何与Unity中的StructureMap的Registry类相同的东西?
我喜欢考虑一个层/组件/库来自我配置 - 从而填充容器.所以"父"层只需要知道注册类.
我已经使用Unity很长一段时间,但我一直使用它与构造函数注入.为了减少我必须注入到我的视图模型中的类的数量(因为我的命令依赖于它们),我想我会尝试创建一个使用Property Injection的概念,从而消除对大型构造函数参数列表的要求.这是场景......
我正在创建一个视图模型,其中的命令位于以某种方式使用/更新软件视图模型的属性上.我希望将View Model的实例传递给View Models属性上的Commands的构造函数.例如
public MainViewModel
{
public MainViewModel()
{
Customers = new ObservableCollection<CustomerViewModel>();
}
[Depedency("LoadCommand")]
public ICommand LoadCustomersCommand { get; set; }
public ObservableCollection<CustomerViewModel> Customers { get; private set; }
}
public LoadCustomersCommand : ICommand
{
public LoadCustomersCommand(MainViewModel mainViewModel)
{
//Store view model for later use
}
//... implementation
}
//Setup code in App.Xaml
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<ICommand, LoadCommand>("LoadCommand");
unityContainer.RegisterType<MainViewModel>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
当我解析MainViewModel类时,我得到一个StackOverflow异常(如果Visual Studio完全回来的话).现在我希望Unity首先创建一个MainViewModel实例,因为它基本上是一个单例,然后查看View Model的实例并创建在新创建的MainViewModel中传递的Command,但显然我错了.
有任何想法吗?
我想明确"释放"Unity解析的对象实例.我希望Teardown方法应该完全用于此,所以我尝试了这样的事情:
container.RegisterType(typeof(IMyType), typeof(MyType),
new MyLifetimeManager());
var obj = container.Resolve<IMyType>();
...
container.Teardown(obj);
Run Code Online (Sandbox Code Playgroud)
MyLifetimeManager存储对象实例HttpContext.Current.Items.我希望该Teardown方法将调用RemoveValue生命周期管理器并释放MyType实例和生命周期管理器实例.它不起作用.首先RemoveValue是没有调用,如果我再次调用,Resolve<IMyType>我将获得先前解析的实例.
Teardown方法应该怎么办?尽管有他的终身经理,我怎么能释放对象?
编辑:
如果Teardown没有发布实例,谁呢?谁打电话RemoveValue给终身经理?
我们目前正在运行一个mvc3 webapp,本周早些时候我们尝试升级到mvc4,但是在我们发布网站之后,w3wp.exe开始吃大量内存(> 2gb)并在应用程序池上获得超时.
我们使用Unity(最新版本)和unity.mvc3,我们使用unity.mvc3中的特殊生命周期管理器来处理dbcontext.
我们使用ANTS内存分析器搜索问题,但找不到任何问题.只有实时网站似乎遇到了这个问题.
有没有人在这里有一些指示?
我们在一些新的类库中使用Microsoft的Unity框架进行依赖注入.主应用程序正在使用一些期望Unity v2.0.414的其他企业库(通用和日志),但我们使用Unity v2.1.515实现了我们的库.
为了解决版本差异,我为主应用程序创建了一个app.Config,并将一个bindingRedirect条目放入配置文件中并且运行良好.然而,我们刚刚了解到应用程序到目前为止从未使用过app.config,而mgmt更喜欢这种方式.
那么有可能以编程方式实现程序集重定向(即在代码中)吗?谢谢!
我正在尝试使用以下代码创建类的实例(在运行时通过字符串):
Assembly assembly = Assembly.GetAssembly(typeAssembly);
object instance = assembly.CreateInstance(typeName); //throws MissingMethodException
Type classType = instance.GetType();
Run Code Online (Sandbox Code Playgroud)
但是,我试图实例化的类在构造函数中有两个参数,由Unity IoC容器解析.
当我执行上面的代码时,它会抛出'System.MissingMethodException'.
我在网上搜索过,看起来Assembly.CreateInstance将无法解析Unity依赖注入.
这是一个死胡同还是有一种方法可以使用"CreateInstance"方法实例化该类并解析Unity依赖关系?
目前我被困在我认为是一个简单的架构问题上.
我有一个控制器(这些只是示例,因为我不能分享我的真实代码,但原则成立):
public class StackOverflowController : Controller
{
private readonly IStackOverflowService stackOverflowService;
public StackOverflowService (IStackOverflowService stackOverflowService)
{
this.stackOverflowService = stackOverflowService;
}
// GET: StackOverflow
public ActionResult Index()
{
var foo = stackOverflowService.Get(bar);
return View(foo);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用Unity MVC4 Bootstrapper来管理注入:
public static class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IStackOverflowService, StackOverflowService>("DefaultStackOverflowService");
return container;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好,注射工作.我卡住的地方现在很容易基于配置或某些变量,我希望能够改变它的实现StackOverflowService.
因此,例如,如果url ="somethingelse.com",我希望能够自动注入继承自IStackOverflowService的CustomStackOverflowService.但这是我迷路的地方.我尝试使用命名注册,但我似乎无法弄清楚如何根据一些替代标准手动解析要实现的正确服务.
如果有人可以请求帮助那将是史诗:) …
c# dependency-injection inversion-of-control unity-container asp.net-mvc-4
我有一个ASP .Net Web API控制器,我想要2个参数.第一个是EF上下文,第二个是缓存接口.如果我只有EF上下文,则构造函数被调用,但是当我添加缓存接口时,我得到错误:
尝试创建"MyV1Controller"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.
private MyEntities dbContext;
private IAppCache cache;
public MyV1Controller(MyEntities ctx, IAppCache _cache)
{
dbContext = ctx;
cache = _cache;
}
Run Code Online (Sandbox Code Playgroud)
我的UnityConfig.cs
public static void RegisterTypes(IUnityContainer container)
{
// TODO: Register your types here
container.RegisterType<MyEntities, MyEntities>();
container.RegisterType<IAppCache, CachingService>();
}
Run Code Online (Sandbox Code Playgroud)
我希望Entity现在知道两种类型,当为MyV1Controller函数发出请求时,它应该能够实例化一个实例,因为该构造函数接受它知道的类型,但事实并非如此.知道为什么吗?
[编辑]请注意,我创建了自己的类(IConfig)并注册了它并将其添加到构造函数中并且它工作正常,但每当我尝试添加IAppCache到我的构造函数并向API发出请求时,我得到错误告诉我它可以构造我的控制器类.我看到的唯一区别IAppCache是不在我的项目名称空间中,因为它是第三方类,但这应该与我的理解无关.
以下是CachingService的构造函数
public CachingService() : this(MemoryCache.Default) { }
public CachingService(ObjectCache cache) {
if (cache == null) throw new ArgumentNullException(nameof(cache));
ObjectCache = cache;
DefaultCacheDuration = 60*20;
}
Run Code Online (Sandbox Code Playgroud) c# asp.net dependency-injection unity-container asp.net-web-api
unity-container ×10
c# ×6
.net ×2
asp.net ×2
app-config ×1
autofac ×1
factory ×1
mvvm ×1
reflection ×1
silverlight ×1