现在,我们有一个包含所有数据库调用的dll文件,我无法更改它。不过,我需要从Mvc 3项目中打电话给我。调用它的过程很简单,我使用以下方法:
ManageProvider.GetProxy<T>(ident);T是一个接口,我想从它得到类(它就像它自己的IoC ),ident是用户标识类。所以通过打电话
var classReturned = ManageProvider.GetProxy<ICommunity>(new UserIden{ Email = "test@test.com" });我会带着所有的社区功能回来一堂课。现在,我想在我的Mvc 3项目中实现统一。问题是,我是否可以通过统一将这些调用添加到dll文件中?
我想通过以下方式解析该呼叫:
var classReturned = myContainer.Resolve<ICommunity>(new UserIden{ Email = "test@test.com" });我怎样才能在统一中注册这个(甚至可能)?
更新:
1)与定义依赖属性相比,使用电子邮件/用户Is调用方法更好吗?(除下文外)
2) dll文件中现在有大约20个接口。我应该把它们都添加到同一个存储库中吗?(除下文外)
public class ProxyWrapper : IDllRepository
{
[Dependency]
public UserIdent UserIdent { get; set; }
public ICommunity GetCommunity()
{
return ManageProvider.GetProxy<ICommunity>(UserIdent);
}
public IDesktop GetDesktop()
{
return ManageProvider.GetProxy<IDesktop>(UserIdent);
}
}
public interface IDllRepository
{
ICommunity GetCommunity();
IDesktop GetDesktop();
}最好的方法是什么,我如何从代码中调用它?依赖属性是否也属于Service反模式?
更新23.05.11
是的,差不多是这样的。它们包含提供给包含dll文件的所有项目的所有逻辑。
关于ManagerProvider。它接受一个接口并返回映射到该接口的类。因此,对于社区来说,界面看起来是这样的(删除了大量的调用以保持其简短,还有帖子、评论、社区创建/更新等):
List<CommunityThread> GetThreads(int pStartRowIndex, int pMaximumRows, string pOrderBy, string pSearchExpression);
Guid? CreateThread(string pTitle, string pDescription, string pPostContent);
bool DeleteThread(Guid pThreadId);
List<CommunityThread> GetCommunityUserThreads(Guid pCommunityUserId); 2)我无法更新的是ManageProvider.GetProxy的工作方式。GetProxy是dll文件中硬编码的类。这是社区的一部分。类对所有其他接口也是一样的,如果类型(接口).返校课。
private static IManageProxy GetProxyForInterface<T>(UserIdent pIdent)
{
....
if (typeof(T).Equals(typeof(ICommunity)))
return new PCommunity();
....
}3)使用这个新包装器类注册后,我可以通过以下代码调用它(MvcUnityContainer是一个静态类,只有一个名为Container的属性):
var c = MvcUnityContainer.Container.Resolve<IBackendRepository>(new PropertyOverride("UserIdent",
new UserIdent()));Global.asax
IUnityContainer container = InitContainer();
MvcUnityContainer.Container = container;
DependencyResolver.SetResolver(new UnityMvcResolver(container));问题是,我需要静态类MvcUnityContainer吗?是否可以将DependecyResolver配置为为我做到这一点?类似于(问题是它不接受覆盖参数):
var c = DependencyResolver.Current.GetService<IBackendRepository>(new PropertyOverride("UserIdent", new UserIdent()));发布于 2011-05-19 21:13:01
我认为您需要将创建隐藏在另一个抽象之后,例如:
public interface ICommunityRepository
{
ICommunity GetByEmailAddress(string address);
}
public class ManageProviderCommunityRepository
: ICommunityRepository
{
public ICommunity GetByEmailAddress(string address)
{
var id = new UserIden { Email = address };
return ManageProvider.GetProxy<ICommunity>(id);
}
}这将隐藏这个抽象后面的ManageProvider和UserIden,并允许您稍后用更有用的东西替换它,并使测试更容易。
现在的登记非常容易:
RegisterType<ICommunityRepository, ManageProviderCommunityRepository>();不要像在示例中那样调用myContainer.Resolve,而是在类中注入依赖项。这使您无法使用服务定位器反模式。
发布于 2011-05-19 20:41:27
也许您可以这样做,使用InjectionFactory:
myContainer.RegisterType<ICommunity>(
new InjectionFactory(c => ManageProvider.GetProxy<ICommunity>(new UserIden {Email = "test@test.com"})));
var classReturned = myContainer.Resolve<ICommunity>();..。虽然您无法将UserIden作为参数传递给解析调用,但我不确定这是否是您想要的。
要注册程序集的所有公共类,您可能可以在Assembly.GetTypes()上迭代并以同样的方式注册它们?
https://stackoverflow.com/questions/6061481
复制相似问题