我想创建一些数据属性来装饰我正在使用的系统方法。我在系统应用程序的许多方面看到,开发人员基于某些信息实例化数据库上下文。这样的事情:
public IQueryable<Customers> ListCustomersByName(Username user, Password password, string firstName)
{
var context = DatabaseContextFactory(user, password);
return context.Customers.Where(c => c.FirstName == firstName);
}
看来,实际上,我的方法只需要一个信息来寻找客户,即客户的名字。这里还有很多其他类似的方法。 我的想法是做那样的事情:
[UsesDatabaseAttribute]
public IQueryable<Customers> ListCustomersByName(Database context, string firstName)
{
return context.Customers.Where(c => c.FirstName == firstName);
}
然后,我将调用我的方法传递,用户名,密码和名称进行搜索。这样的事情:
public static void Main()
{
var customers = ListCustomersByName(username, password, firstName);
//... Use this list to do anything
}
我的DataAttribute将接收,翻译并调用传递数据库上下文的方法。
简而言之,我希望从每个方法中删除实例化数据库的所有逻辑,并将其集中到装饰方法的属性中。
试图举例说明,我的想法与下面的代码相同,但不是让方法重载,我想要使用数据属性的装饰方法(因为这个场景与其他方法和其他表重复,我想避免重载每个不同的表格):
public IQueryable<Customers> ListCustomersByName(Username user, Password password, string firstName)
{
var context = DatabaseContextFactory(user, password);
return ListCustomersByName(context, firstName);
}
public IQueryable<Customers> ListCustomersByName(Database context, string firstName)
{
return context.Customers.Where(c => c.FirstName == firstName);
}
public static void Main()
{
var customers = ListCustomersByName(username, password, firstName);
//... Use this list to do anything
}
那是可能的吗?
答案 0 :(得分:1)
据我所知,您希望将依赖项(上下文)注入包含访问数据库方法的类。为此您可以使用一些DI容器,例如尝试统一https://msdn.microsoft.com/en-us/library/ff648211.aspx 代码将如下所示:
class ContextFactory
{
public Context Create(string userName, string Password)
{
//creating context
}
}
class SomeClass
{
private ContextFactory _factory;
public SomeClass(ContextFactory factory)
{
_factory = factory;
}
public IQueryable<Customers> ListCustomersByName(Username user, Password password, string firstName)
{
var context = _factory.Create(user, password);
return customers.Where(c => c.FirstName == firstName);
}
}
public static void Main()
{
//creating container and register dependency
var container = new UnityContainer();
container.RegisterType<ContextFactory>();
var someClass = container.Resolve<SomeClass>();
var customers = someClass.ListCustomersByName(username, password, firstName);
//... Use this list to do anything
}