我有一个业务对象,比方说客户,它有太多的字段要显示在一个页面中,所以我将它拆分为不同的标签页.数据不是我可以将它分成有意义的位(如地址,状态,街道名称等),所以我决定保持相同的模型和视图模型,并有不同的视图(每个标签页的内容是一个不同的视图)绑定到相同的视图模型.
首先是这是正确的方法,为什么不呢?
其次,如果是,我如何使用unity 将相同的视图模型传递给子视图?目前我使用构造函数注入,但它们是视图模型的新实例.
干杯,
阿里
使用PRISM时,使用unity来连接事物的正常方法是定义一个接口并使用此接口注册一个实现.现在,我对视图有疑问.场景很简单:
假设允许设置播放命令的自定义视频控件.该控件由简单的接口"IPlayControlView"定义.显而易见的问题是,当我解决此控件并尝试将其添加到a时StackPanel,它不起作用,因为我有一个IPlayControl,而不是一个UIElement.
我可以投它UIElement,因为我知道它是一个UIElement.但有没有更好的方法,比如
public interface IPlayControlView : UIElement
Run Code Online (Sandbox Code Playgroud)
这不起作用,但也许其他一些事情会起作用......
这是一个普遍的问题,如果我使用接口解析视图,我每次都会遇到这个问题.也许它不是它的方式,但我一直认为其中一个....好吧,只是有个主意.我将只使用一个属性UIElement扩展IPlayControl,并将其设置为对自身的引用.所以,没关系,问题在打字时回答:-)
如果有更好的方法,我总是喜欢学习新事物.也许是IUIElement?
克里斯
我一直在比较Unity和MEF(用于Prism)并且正在向MEF迈进.唉,最近我看到了Unity很酷的运行时依赖性解析 - 如果我想添加一个模块,我应该view使用它添加它的类型ServiceLocator,如果我有一个依赖构造函数说明view model,Unity将为我初始化它,以及VM的依赖项(在其他服务和模块中).
MEF是否支持这种行为?
谢谢.
我正在尝试使用Unity Configuration向类属性添加依赖项,并且我尝试注入的类型也是通用的.
我有界面
public interface ISendMessage
{
void Send(string contact, string message);
}
Run Code Online (Sandbox Code Playgroud)
类
public class EmailService : ISendMessage
{
public void Send(string contact, string message)
{
// do
}
}
Run Code Online (Sandbox Code Playgroud)
类
public class MessageService<T> where T : ISendMessage
{
}
Run Code Online (Sandbox Code Playgroud)
我尝试通过构造函数注入在其他类中使用它
public MyService(MessageService<ISendMessage> messageService)
{
}
Run Code Online (Sandbox Code Playgroud)
我怎么注射MessageService<EmailService>而不是MessageService<ISendMessage>?
我试着通过app.config来做
<alias alias="MessageService'1" type="MyNamespace.MessageService'1, MyAssembly" />
<alias alias="EmailMessageService'1" type="MyNamespace.MessageService'1[[MyNamespace.EmailService, MyAssembly]], MyAssembly" />
Run Code Online (Sandbox Code Playgroud)
我收到错误
无法解析类型名称或别名MessageService'1.请检查配置文件并验证此类型名称.
我如何通过MessageService<T>实现参数MessageService<EmailService>?
谢谢
更新
我将我的课修改为以下内容:
public class MessageService<T> where T : …Run Code Online (Sandbox Code Playgroud) 我是MVC的新手,我遇到了问题.我设法找到的所有示例都指的是简单的控制器而不是API控制器.也许任何人都有一个工作代码示例,关于如何在Application_Start()上向Unity注册依赖项并调整代码,以便在创建apicontroller类之后,将正确的依赖项传递给它.让我们说这是我的控制器的定义:
public class BookController : ApiController
{
private IBookService bookSerivce;
public BookController (IBookService bookSerivce)
{
this.bookSerivce= bookSerivce;
}
}
Run Code Online (Sandbox Code Playgroud)
我期望通过以下方式将其注册为统一:
UnityContainer container = new UnityContainer();
// Register services
container.RegisterType<IBookService , BookService>();
// Register controllers
container.RegisterType<IHttpController, BookController>("Books");
Run Code Online (Sandbox Code Playgroud)
现在,我需要做些什么才能使MVC使用unity来解析依赖关系,开始创建这个控制器的实例并将依赖关系传递给它?
我正在使用MVC 4.任何想法都将受到赞赏.
干杯
dependency-injection controller unity-container asp.net-mvc-4 asp.net-web-api
我正在写一个WPF MEF应用程序.在过去,我已经编写了基于WPF IoC的应用程序,并使用PRISM构建代码模块,如下所示:
在IoC领域,每个模块在加载时都会使用IoC容器注册其组件.如果我希望我的两个模块能够重用彼此的组件,他们只需要引用我的一个接口项目并注入组件.
但是在MEF中,我无法找到任何将部件分离到模块中以及这种类型的模块间组件重用的良好实践或指南.我有五个问题:
modularity mef ioc-container inversion-of-control unity-container
我想使用Unity注册一个通用的Repository类.
这是我的通用类:
public class Repository<TModel>
: IRepository<TModel> where TModel : class, IModel
Run Code Online (Sandbox Code Playgroud)
TModel是与Entity一起使用的POCO对象.
如果我这样注册就行了.
IOC_Container.RegisterType(typeof(IRepository<Employee>), typeof(Repository<Employee>));
Run Code Online (Sandbox Code Playgroud)
这需要我注册每个TModel,这变得很麻烦.
我有一个使用反射动态注册我的服务类的引导程序,我想对存储库执行相同的操作.
这是服务的引导程序代码:
var currentAssembly = Assembly.LoadFrom(assembly);
var assemblyTypes = currentAssembly.GetTypes();
foreach (var assemblyType in assemblyTypes)
{
if (assemblyType.IsInterface)
{
continue;
}
if (assemblyType.FullName.EndsWith("Service"))
{
foreach (var requiredInterface in assemblyType.GetInterfaces())
{
if (requiredInterface.FullName.EndsWith("Service"))
{
var typeFrom = assemblyType.GetInterface(requiredInterface.Name);
var typeTo = assemblyType;
IOC_Container.RegisterType(typeFrom, typeTo);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
有什么建议?
我正在使用MS Unity和"按惯例注册"(自动注册)来注册命名空间中的所有类.代码(见下文)适用于它并返回预期结果
var container = new UnityContainer();
container.RegisterTypes( AllClasses.FromLoadedAssemblies().Where(
t => t.Namespace == "DependencyInjectionExample.Test"),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.ContainerControlled);
Run Code Online (Sandbox Code Playgroud)
结果
集装箱有4个注册
- IUnityContainer'[默认]'容器
- TestClass1'[默认]'ContainerControlled
- TestClass2'[默认]'ContainerControlled
- TestClass3'[默认]'ContainerControlled
我的问题是我无法弄清楚如何解决它们.我试过了
var allRegistered = container.ResolveAll<ITestable>();
Run Code Online (Sandbox Code Playgroud)
但它不会返回任何内容(所有测试类都实现了ITestable).当我尝试
var singleRegistered = container.Resolve<ITestable>();
Run Code Online (Sandbox Code Playgroud)
我得到'ResolutionFailedException' - "类型ITestable没有可访问的构造函数".我读过这是因为注册的类型没有命名,但在使用自动注册时是不可能的.
我该怎么办才能解决注册类型?
编辑
namespace DependencyInjectionExample.Test
{
public interface ITestable
{
string SaySomething();
}
}
Run Code Online (Sandbox Code Playgroud)
三个测试类之一.他们都做同样的事情.
namespace DependencyInjectionExample.Test
{
public class TestClass1 : ITestable
{
public TestClass1() { }
public string SaySomething()
{
return "TestClass1 hello";
}
}
}
Run Code Online (Sandbox Code Playgroud) 让我们说我有一个clas
class Foo : FooBase {
public Foo(Settings settings, IDbRepository db)
: base(settings) {
this.db = db;
}
...
}
Run Code Online (Sandbox Code Playgroud)
基本上FooBase通过构造函数接收设置并从配置文件加载一些配置.
然后我有实现IDbRepository的类MySQLRepository
class MySQLRepository : IDbRepository {
...
public MySQLRepository(IConfigurationRepository config) {
conn = new MySQLConnection(config.GetConnectionString());
}
...
}
Run Code Online (Sandbox Code Playgroud)
在Program.cs我有:
Foo foo = container.Resolve<Foo>();
Run Code Online (Sandbox Code Playgroud)
问题是只有在加载了所有其他依赖项之后才调用FooBase的构造函数.但是在调用FooBase构造函数之前不会加载配置.
我的想法是创建一个IDbRepository和任何其他需要配置的接口的惰性实现.
这是一个好主意吗?我如何使用Unity容器实现它?
我有以下课程:
public class TestInjection
{
private ILogger logger;
public TestInjection(ILogger logger)
{
this.logger = logger;
}
public void Process()
{
try
{
int zero = 0;
int result = 5 / zero;
}
catch (DivideByZeroException ex)
{
logger.Log(LogLevel.Error, "test message", ex);
Console.WriteLine("logged message from class");
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我Program.cs的代码中:
IUnityContainer container = new UnityContainer();
container.RegisterType<TestInjection>();
var myTestClass = container.Resolve<TestInjection>(new ResolverOverride[] { new ParameterOverride("logger", LogManager.GetCurrentClassLogger()) });
myTestClass.Process();
Run Code Online (Sandbox Code Playgroud)
LogManager.GetCurrentClassLogger()如果Logger无法访问该类的默认构造函数,如何使用unity容器进行解析?
谢谢。
PS:这是我第一次使用DI和Unity。
unity-container ×10
c# ×6
.net ×2
mef ×2
prism ×2
controller ×1
interface ×1
lazy-loading ×1
modularity ×1
silverlight ×1
uielement ×1
views ×1